MySQL5.6+Centos7.6集群搭建

1、单节点搭建

1.1 准备

需要的软件:ssh客户端,filezilla,centos7,mqsql5.6

$ mkdir sfm         # 在根目录下创建自己的文件夹

使用FTP上传MySQL5.6二进制文件下载地址到sfm文件夹下。

1.2 添加用户和组

$ groupadd mysql 
$ useradd -g mysql mysql

1.3 mysql安装包解压

$ cd sfm/
$ ll              # 查看数据库文件
-rw-r--r--. 1 root root 343082156 11月  3 17:07 mysql-5.6.48-linux-glibc2.12-x86_64.tar.gz

$ tar -xvf mysql-5.6.48-linux-glibc2.12-x86_64.tar.gz      # 解压
$ mv mysql-5.6.48-linux-glibc2.12-x86_64 mysql             # 重命名
$ cd /sfm/mysql
$ chown -R mysql .           # 指定文件的拥有者改为指定的用户或组
$ chgrp -R mysql .      

1.4 安装 autoconf

在线安装:

$ yum -y install autoconf

离线安装:

# 参考第四节

1.5 安装MySQL

1.5.1 安装

$ /sfm/mysql/scripts/mysql_install_db --user=mysql --basedir=/sfm/mysql --datadir=/sfm/mysql/data

1.5.2 复制配置文件

$ cp /sfm/mysql/support-files/my-default.cnf /etc/my.cnf

1.5.3 修改配置文件

$ vim /etc/my.cnf
[client]
port = 3306
socket = /sfm/mysql/mysql.sock
default-character-set = utf8
[mysqld]
skip-name-resolve
user = mysql
basedir = /sfm/mysql
datadir = /sfm/mysql/data
port = 3306
server_id = 10
socket = /sfm/mysql/mysql.sock
pid-file = /sfm/mysql/mysql.pid
log-error = /sfm/mysql/data/mysql.err
log-bin = /sfm/mysql/data/mysql-bin
character-set-server = utf8

1.5.4 设置系统服务

$ cp /sfm/mysql/support-files/mysql.server /etc/init.d/mysqld
$ vim /etc/init.d/mysqld
# 将所有/user/local 路径改为 /sfm

1.5.5 配置环境变量

$ echo 'export PATH=/sfm/mysql/bin:$PATH' >> /etc/profile
$ source /etc/profile

1.6 启动测试

1.6.1 启动

$ service mysqld start

1.6.2 修改mysql密码

$ mysqladmin -u root password '123456'

提示:如果后面开启远程连接,请把密码设置复杂一点。很重要!!!!!!!!!!!!!!!

1.6.3 登陆mysql

$ mysql -uroot -p
[root@localhost /]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.6.42-log MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

$ mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

1.6.4 配置远程连接

慎重开启,如果处于公网环境,强烈建议不开启。

> use mysql;
> update user set Host='%' where user ='root' limit 1;
select Host,user,password from user where User='root';
update user set Host='%' where user ='root' and Host='localhost';
delete from user where Host='localhost' and User='';
> flush privileges;
> exit
$ service mysqld restart

防火墙放行:

$ systemctl start firewalld                     # 启动friewall
$ systemctl status firewalld                     # 查看firewall启动情况
$ firewall-cmd --zone=public --add-port=3306/tcp --permanent   # 开启3306端口
$ firewall-cmd --reload                                       #  重启 
$ firewall-cmd --query-port=3306/tcp              # 查看3306端口是否开启

1.6.5 开机启动配置

$ touch /usr/lib/systemd/system/mysql.service
$ vim /usr/lib/systemd/system/mysql.service
[Unit]
Description=MySQ
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/sfm/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
#Restart=on-failure
#RestartPreventExitStatus=1
#PrivateTmp=false
$ systemctl start mysql
$ systemctl enable mysql  # 开启开机启动

2、主从MySQL主从集群搭建

前一台主机IP地址为:192.168.1.104,作位主机master

另外在新建一台主机:192.168.1.102,作位从机slave

2.1 开启master上的log-bin功能:

# 192.168.1.104 操作
$ cat /etc/my.cn

# 输出
---
server_id = 10
log-bin = /usr/local/mysql/data/mysql-bin
----

代表已经开启log-bin功能

登陆mysql在master服务器上建立账户,并授权slave功能

$ mysql -uroot -p
> grant replication slave on *.* to 'mysql'@'%' identified by 'mysql';
> flush privileges;
> show master status;
# 输出
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000035 |   180708 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

# 主库上当前的二进制日志名和偏移量值。这个操作的目的是为了在从数据库启动以后,从这个点开始进行数据的恢复.

2.2 从库操作

2.2.1 修改从数据库的配置文件

注意 server-id的值必须是唯一的,不能和主数据库的配置相同,如果有多个从数据库服务器,每个从数据库服务器必须有自己唯一的 server-id值。

$ vim /etc/my.cnf

# 修改如下:server_id必须唯一
server_id = 11

# 重启服务
$ serivce mysqld restart

2.2.2 开启复制

MASTER_HOST:主机IP

MASTER_PORT:主机端口

MASTER_USER:主机用户

MASTER_PASSWORD:主机密码

MASTER_LOG_FILE:主机的日志文件

MASTER_LOG_POS:偏移量。如果输入1,全部复制,有可能密码也会被复制过来

$ mysql -uroot -p

> CHANGE MASTER TO MASTER_HOST='192.168.1.104',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='youxuan' ,MASTER_LOG_FILE='mysql-bin.000035',MASTER_LOG_POS=180708;

> start slave;            # 开启复制
> show processlist\G;     # 命令将显示类似如下的进程:
*************************** 1. row ***************************
     Id: 1
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: init
   Info: show processlist
*************************** 2. row ***************************
     Id: 4
   User: root
   Host: 192.168.1.109:63170
     db: sfm
Command: Sleep
   Time: 332
  State:
   Info: NULL
*************************** 3. row ***************************
     Id: 5
   User: root
   Host: 192.168.1.109:63173
     db: sfm
Command: Sleep
   Time: 355
  State:
   Info: NULL
*************************** 4. row ***************************
     Id: 6
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 457
  State: Waiting for master to send event
   Info: NULL
*************************** 5. row ***************************
     Id: 7
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 317
  State: Slave has read all relay log; waiting for the slave I/O thread to update it
   Info: NULL
5 rows in set (0.00 sec)

ERROR:
No query specified

在主机上修改下数据查看数据库也会被同步更新。

> stop slave    # 停止复制

3、主从MySQL双主集群搭建

之前的采取的主从结构:

主机IP地址为:192.168.1.104,作位主机master

新建一台主机:192.168.1.102,作位从机slave

想要实现的结构:

主机IP地址为:192.168.1.104,作位主机master1,slave2

新建一台主机:192.168.1.102,作位从机slave1,master2

在192.168.1.102(作为master2)执行以下操作:

# 进入Mysql交互式环境
$ mysql -uroot -p
> grant replication slave on *.* to 'mysql'@'%' identified by 'mysql';      # 授权
> flush privileges;
> show master status;    # 查看主机master2状态
#输出
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000020 |      372 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

在192.168.1.104(作为slave2)执行以下操作:

$ mysql -uroot -p

> CHANGE MASTER TO MASTER_HOST='192.168.1.102',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='youxuan' ,MASTER_LOG_FILE='mysql-bin.000020',MASTER_LOG_POS=372;

> start slave            # 开启复制
> show processlist\G     # 命令将显示类似如下的进程:

双主结构同步完成。

4、配置MySQL+keepalived 高可用环境

利用keepalived实现mysql数据库的高可用,Keepalived+Mysql双主来实现MYSQL-HA,我们必须保证两台mysql数据库的数据完全一致,实现方法是两台mysql互为主从关系,通过keepalived配置VIP,实现当其中的一台mysql数据库宕机后,应用能够自动切换到另外一台mysql数据库上去,保证系统的高可用。

4.1 安装Keepalived

4.1.1 依赖包安装

在线安装:

$ yum install -y gcc openssl-devel popt-devel

离线安装:

  • 确保有一台电脑可以连接互联网

  • 执行指令,其中xxx是你要安装的软件名,根据需要自行修改。/tmp/rpm是下载后保存的路径,也可以选其它路径存放下载的安装包文件:

    $ yum install -y gcc openssl-devel popt-devel  --downloadonly --downloaddir /tmp/rpm
    
  • 如果下载正常,下载完成后就可以在本机/tmp/rpm路径下找到安装包。

  • 分发rpm包到其它机器

  • 进入/tmp/rpm路径下,执行指令

    $ rpm -ivh *.rpm --force --nodeps
    

    通过以上步骤即可离线安装软件。

4.1.2 下载编译Keepalived和killall

Keepalived,对外统一提供虚IP,并且可以自动切换。killall主要是监听数据库端口的功能。

在线安装:

$ yum install -y keepalived
$ yum install -y psmisc.x86_64

离线安装:参看上面的

4.2 Keepalived配置

4.2.1 配置文件修改

先查看网卡:

$ ip addr

# 输出如下
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 2c:f0:5d:19:aa:1e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.102/24 brd 192.168.1.255 scope global noprefixroute dynamic eno1
       valid_lft 6375sec preferred_lft 6375sec
    inet6 fe80::4ede:da95:8fd4:f89c/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:19:d9:8c:f8 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

其中,第二项为服务器的网卡名 eno1

其中virtual_ipaddress为提供外部访问的IP地址,这里使用192.168.1.111,必须保持两台机器virtual_ipaddress相同。

修改192.168.1.102(master1)配置文件:

操作如下:

$ vim /etc/keepalived/keepalived.conf

配置如下:

# 全局配置 不用动  只需注释掉vrrp_strict
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1  # 邮件服务器,暂时没用到,随便填 
   smtp_connect_timeout 30
   router_id LVS_DEVEL        # 两台服务器必须唯一
   vrrp_skip_check_adv_addr
   #必须注释掉 否则报错
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 检查mysql服务是否存活的脚本
vrrp_script chk_mysql {
    script "/usr/bin/killall -0 mysqld"
}
# vrrp配置虚IP
vrrp_instance VI_1 {
    # 状态:MASTER  另外一台机器为BACKUP
    state MASTER
    # 绑定的网卡
    interface eno1
    # 虚拟路由id  两台机器需保持一致
    virtual_router_id 51
    # 优先级 MASTER的值要大于BACKUP
    priority 100      # MASTER节点高于BACKUP节点
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟IP地址 两台keepalived需要一致
    virtual_ipaddress {
        192.168.1.111           # 向外提供的IP,两台机器相同
    }
    # 检查脚本 vrrp_script的名字
    track_script {
        chk_mysql
    }
}

###后边的virtual_server全部注释掉 它是和LVS做负载均衡用的  这里用不到
###

修改192.168.1.104(master2)配置文件:

查看网卡:eno1

# 全局配置 不用动  只需注释掉vrrp_strict
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1  # 邮件服务器,暂时用到,随便填 
   smtp_connect_timeout 30
   router_id LVS_DEVEL        # 两台服务器必须唯一
   vrrp_skip_check_adv_addr
   #必须注释掉 否则报错
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 检查mysql服务是否存活的脚本
vrrp_script chk_mysql {
    script "/usr/bin/killall -0 mysqld"
}
# vrrp配置虚IP
vrrp_instance VI_1 {
    # 状态:MASTER  另外一台机器为BACKUP
    state BACKUP
    # 绑定的网卡
    interface eno1
    # 虚拟路由id  两台机器需保持一致
    virtual_router_id 51
    # 优先级 MASTER的值要大于BACKUP
    priority 90     
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟IP地址 两台keepalived需要一致
    virtual_ipaddress {
        192.168.1.111           # 向外提供的IP,两台机器相同
    }
    # 检查脚本 vrrp_script的名字
    track_script {
        chk_mysql
    }
}

###后边的virtual_server全部注释掉 它是和LVS做负载均衡用的  这里用不到
###

killall命令脚本。killall -0并不是杀掉进程,而是检查进程是否存在,如果存在则返回0,如果不存在则返回1。当返回1时,keepalived就会切换主备状态。

4.2.2 启动keepalived

关闭防火墙或者开启组播:选择其中一项执行到两台服务器

关闭防火墙:

$ sudo systemctl stop firewalld      # 临时关闭

$ sudo systemctl disable firewalld   # 永久关闭

$ sudo systemctl status  firewalld   # 查看防火墙状态。

开启组播:

$ firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eno1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT;
$ firewall-cmd --reload;

eno1 为服务器网卡名称 使用命令 ip addr 查看,224.0.0.18为默认组播地址。

开启keepalived:

# 两台机器同时开启
$ service keepalived start
# 查看开启状态
$ service keepalived status

使用ip addr查看是否生成虚拟IP:192.168.1.111

[root@localhost keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 2c:f0:5d:19:aa:31 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.102/24 brd 192.168.1.255 scope global noprefixroute dynamic eno1
       valid_lft 4957sec preferred_lft 4957sec
    inet 192.168.1.111/32 scope global eno1
       valid_lft forever preferred_lft forever
    inet6 fe80::bb62:4fd:d2f3:ac81/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:5c:7a:b1:08 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

成功开启

4.3 测试MySQL高可用

# master1 关闭mysqld服务 查看master1和maste2的ip地址
$ service mysqld stop
$ ip addr
# 正确的情况是:
# master1机器虚拟ip消失,master2机器出现虚拟ip
# master1 开启mysqld服务 查看master1和maste2的ip地址
$ service mysqld start
$ ip addr
# 正确的情况是:
# master1机器出现虚拟ip, master2机器虚拟ip消失
1、# master1和master2同时关闭mysqld服务 查看master1和maste2的ip地址

$ service mysqld stop      # master1机器操作
$ service mysqld stop      # master2机器操作
$ ip addr
# 正确的情况是:
# master1和master2机器虚拟ip消失

2、# 开启master2的mysqld服务
$ service mysqld start      # master2机器操作
$ ip addr                   # master2机器操作
# 正确的情况是:
# master2机器虚拟ip出现

3、# 开启master1的mysqld服务
$ service mysqld start      # master1机器操作
$ ip addr  
# 正确的情况是:
# master1机器出现虚拟ip, master2机器虚拟ip消失

MySQL高可用环境搭建完成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容