目录 

1. 话不多说直接先看版本

MySQL高可用集群方案 mysql高可用集群怎么搭建_mysql

安装前确认环境
$ rpm -qa | grep mariadb
$ rpm -e -v --nodeps mariadb-libs-5.5.68-1.el7.x86_64

MySQL高可用集群方案 mysql高可用集群怎么搭建_MySQL高可用集群方案_02

2. 安装配置

先说明,我三台机器的IP配置如下:


192.168.32.128 192.168.32.129 192.168.32.130


创建目录先把文件上传,mysql 和node 安装包每个节点均需拷贝,manager 包只拷贝到manager 节点即可,我都放了,因为我复制的时候没想好那个节点做manager。 

MySQL高可用集群方案 mysql高可用集群怎么搭建_MySQL高可用集群方案_03

 


//在三台机器上面执行
$ mkdir -p /home/local/mysql
//开启防火墙端口 
$ firewall-cmd --add-port=3306/tcp --permanent 
$ firewall-cmd --reload 
//关闭selinux 
$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 
$ setenforce 0


添加用户


$ groupadd mysql
$ useradd -r -g mysql mysql


3. 解压安装mysql


$ mkdir -p /usr/local/mysql/{data,log}
//用自己的的上传路径
$ tar -xvf /home/local/mysql/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz -C /usr/local/mysql/ --strip-components 1
备注: 
-C表示解压指定目录如:当前目录/usr/local/mysql/
--strip-components N 表示删除目录结构(n=1表示删除最外层结构)


查看MySQL文件内容,别跳着走,跟着我的节奏


$ ll /usr/local/mysql/


MySQL高可用集群方案 mysql高可用集群怎么搭建_数据库_04

3.1 设置开机启动


$ cp -a /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
$ chmod +x /etc/rc.d/init.d/mysqld
$ chkconfig --add mysqld
$ chkconfig --list


3.2 设置/etc/profile配置文件


$ vi /etc/profile
//加在文件最后
$ export PATH=$PATH:/usr/local/mysql/bin
$ source /etc/profile
//配置完看看环境变量
$ echo $PATH


MySQL高可用集群方案 mysql高可用集群怎么搭建_数据库_05

3.3 修改my.cnf 文件


vim /etc/my.cnf


注意 :以下内容必须全部拷贝, 包括[mysqld]

[mysqld]
 #默认存储引擎InnoDB
 default-storage-engine = InnoDB
 #用户
 #user = mysql
 #监听端口  
 port = 3306
 #socket通信设置,注意这个文件随着mysql启动创建,一般情况下是在/tmp/下,但是有些进程会清理
 socket = /tmp/mysql.sock
 #mysql的安装目录
 basedir = /usr/local/mysql
 #pid目录
 pid-file = /usr/local/mysql/mysql.pid
 #数据文件位置
 datadir = /usr/local/mysql/data
 #允许最大连接数
 max_connections = 18192
 # mysql 定时清理日志文件
 expire_logs_days=10
 #等待关闭连接时间
 wait_timeout = 600
 #服务端字符集
 character-set-server = utf8mb4
 #错误日志
 log-error = /usr/local/mysql/log/error.log
 #不区分大小写
 lower_case_table_names = 1
 #group by
 sql_mode=’STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’

3.4 初始化无密码登录密码、授权


$ /usr/local/mysql/bin/mysqld --initialize-insecure
$ chown -R mysql.mysql /usr/local/mysql
$ chmod -R 777 /usr/local/mysql


3.5 启动及查看日志


$ service mysqld start
$ tail -f /usr/local/mysql/log/error.log


3.6 登录修改密码,安装半同步插件

随机密码生成


cat /dev/urandom | LC_ALL=C tr -dc "[:graph:]" | fold -w 10 |head -2 > ./shard.key


$ mysql -uroot -p
$ ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Root2020@';
$ CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Root2020@';
$ GRANT ALL ON *.* TO 'root'@'%';
$ FLUSH PRIVILEGES;
//开始安装半同步插件
$ install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
$ install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';


创建同步用户,MHA用户与数据半同步用户一起创建,在每台机器都需要执行,我这是开发环境,生成环境请改密码,被黑了,可别来找我 

MySQL高可用集群方案 mysql高可用集群怎么搭建_数据_06

 ,注意: 别写成我的IP导致最后通信失败了   


mysql -uroot -pRoot2020@

use mysql;
select user,host from user;
CREATE USER 'repl'@'192.168.32.%' IDENTIFIED BY 'Root2020@';
ALTER USER 'repl'@'192.168.32.%' IDENTIFIED WITH mysql_native_password BY 'Root2020@';
grant replication slave on *.* to repl@'172.168.9.%';

CREATE USER 'manager'@'192.168.32.%' IDENTIFIED BY 'Root2020@';
grant all on *.* to manager@'192.168.32.%';
ALTER USER 'manager'@'192.168.32.%' IDENTIFIED WITH mysql_native_password BY 'Root2020@';
FLUSH PRIVILEGES;


以上操作在三台机器需要全部完成,操作完成后进行主从数据半同步测试

4.数据半同步配置

修改三台机器的my.cnf配置数据半同步,在文件尾追加增加如下配置:


#server_id 每台机器需要不同,随机,自增都可以 //以下配置拷贝至128节点my.cnf #master节点


server_id = 1
 log-bin = mysql-bin
 binlog_format=mixed
 rpl_semi_sync_master_enabled = 1
 rpl_semi_sync_master_timeout = 1000
 rpl_semi_sync_slave_enabled = 1
 relay_log_purge = 0
 relay-log = relay-bin
 relay-log-index = slave-relay-bin.index

//以下配置拷贝至129节点my.cnf #slave 1 主机新增以下配置,这个节点用来做master高可用切换


server_id = 2
 log-bin = mysql-bin
 binlog_format = mixed
 rpl_semi_sync_master_enabled = 1
 rpl_semi_sync_master_timeout = 1000
 rpl_semi_sync_slave_enabled = 1
 relay_log_purge = 0
 relay-log = relay-bin
 relay-log-index = slave-relay-bin.index

//以下配置拷贝至130节点my.cnf


server_id=3
 log-bin = mysql-bin
 relay-log = relay-bin
 relay-log-index = slave-relay-bin.index
 read_only = 1
 rpl_semi_sync_slave_enabled = 1

配置完成后重启服务,这里有个中继日志,用来干啥,在集群恢复的时候详细说

查看半同步状态


mysql -uroot -pRoot2020@

show variables like '%rpl_semi_sync%'; 
show status like '%rpl_semi_sync%';

#关于上个命令查看到的信息,有几个状态值得关注,将在下面写下来

rpl_semi_sync_master_status :显示主服务是异步复制模式还是半同步复制模式,ON为半同步;

rpl_semi_sync_master_clients :显示有多少个从服务器配置为半同步复制模式;

rpl_semi_sync_master_yes_tx :显示从服务器确认成功提交的数量

rpl_semi_sync_master_no_tx :显示从服务器确认不成功提交的数量

rpl_semi_sync_master_tx_avg_wait_time :事务因开启 semi_sync ,平均需要额外等待的时间

rpl_semi_sync_master_net_avg_wait_time :事务进入等待队列后,到网络平均等待时间

4.1 创建主从半同步


登录master主机,我现在定了就128啦


$ mysql -uroot -pRoot2020@
 $ show master status\G;

MySQL高可用集群方案 mysql高可用集群怎么搭建_数据_07

在129,130执行从节点配置与主节点建立关联


mysql -uroot -pRoot2020@

change master to 
master_host='192.168.32.128',
master_port=3306,
master_user='repl',
master_password='Root2020@',
master_log_file = 'mysql-bin.000001',
master_log_pos=156,
get_master_public_key=1;

start slave;
FLUSH PRIVILEGES;


配置完成后重启服务,查看节点配置

MySQL高可用集群方案 mysql高可用集群怎么搭建_数据库_08

看到如下状态服务半同步主从建立成功

看到主节点注册成功两个从节点

MySQL高可用集群方案 mysql高可用集群怎么搭建_数据_09

看到两个从节点状态正常

MySQL高可用集群方案 mysql高可用集群怎么搭建_数据库_10

可能遇到的问题,及解决方案


Q1: Slave_IO_Running:Connecting;Slave_SQL_Running:Yes ? A1: 从几个点来排除:具体问题具体分析 1.网络不通 2.账户密码错误 3.防火墙 4.mysql配置文件问题 5.主服务器mysql权限 6.创建slave关联时IP错误,或者配置错误 Q2:Slave_IO_Running:No; The slave I/O thread stops because master and slave have equal MySQL server UUIDs ? 这个问题是我自己把虚拟机做克隆,mysql的UUID搞成一样的了,所以注册不过去,解决办法: vim /usr/local/mysql/data/auto.cnf 修改UUID,重启服务 Q3: 遇见问题不要慌,仔细看看那里配置出错了,具体问题具体分析。


5.mysql 主从数据不一致,提示: Slave_SQL_Running: No 的解决方法

在slave服务器上通过如下命令

mysql> show slave status\G;

显示如下情况:表示slave不同步

Slave_IO_Running: Yes
Slave_SQL_Running: No

解决方法一(忽略错误,继续同步):

  1. 先停掉slave
          mysql> stop slave;
  2. 跳过错误步数,后面步数可变
         mysql> set global sql_slave_skip_counter=1;
  3. 再启动slave
         mysql> start slave;
  4. 查看同步状态
        mysql> show slave status\G;

解决方法二(重新做主从,完全同步):

  1. 先进入主库进行锁表,注意窗口不要关闭
      mysql> flush table with read lock;
  2. 把数据进行备份
    mysqldump -uroot -p –opt -R 数据库 > /data/bak.sql
  3. 再新开个窗口,查看主数据库信息
1.    mysql> show master status;
 +——————+———-+————–+——————+——————-+
 | File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
 +——————+———-+————–+——————+——————-+
 | mysql-bin.000005 |   1158 |       |         |          |
 +——————+———-+————–+——————+——————-+
  1. 在从库上停止slave
    mysql> stop slave;
  2. 导入备份的数据文件
    mysql> source /data/bak.sql
  3. 重置同步
    mysql> reset slave;
  4. 重新设置同步节点
    host,port,user,password请根据你的主库设置相应修改,log_file和log_pos根据主库中master status相应修改。
mysql> CHANGE MASTER TO
 MASTER_HOST=’192.168.137.233′,
 MASTER_PORT=3306,
 MASTER_USER=’sync’,
 MASTER_PASSWORD=’123456′,
 MASTER_LOG_FILE=’mysql-bin.000005′,
 MASTER_LOG_POS=1158;
  1. 开启slave
    mysql> start slave;
  2. 查看slave状态
    mysql> show slave status\G;

显示如下信息则表示正常Slave_IO_Running: Yes
Slave_SQL_Running: Yes

  1. 对主数据库解锁
    mysql> unlock tables;