Mysql双机集群搭建(双主集群)
一、 环境准备
OS:RED HAT 7.6
Mysql:mysql-5.7.33
1.1 在安装MySQL要先卸载冲突的包(两节点执行)
查看冲突包 rpm -qa |grep mariadb
卸载冲突包 rpm -e mariadb-libs-1:5.5.60-1.el7_5.x86_64 --nodeps
查看历史包 rpm -qa | grep mysql
普通删除 rpm -e xxx 根据查看历史包的情况卸载
-----使用普通删除不掉的话,用下面的命令进行强力删除
强力删除 rpm -e --nodeps xxx根据查看历史包的情况卸载
1.2 创建用户、初始化(两节点执行)
查看是否已存在mysql用户
id mysql
如果已存在,请先删除存在的用户,使用命令:userdel –r mysql 不存在的情况,使用下列命令创建用户及组
[root@linux_128 src]# groupadd mysql
[root@linux_128 src]# useradd -g mysql -d /home/mysql -m mysql
二、安装配置
2.1 解压安装(两节点执行)
本次用5.7版本的安装包安装
下载好linux版本的mysql安装包
mysql-5.7.33-1.el6.x86_64.rpm-bundle.tar
解压:
tar -xvf mysql-5.7.33-1.el6.x86_64.rpm-bundle.tar
查看列表:
ls -ltr

依次安装使用rpm -ivh xxx依次安装
rpm -ivh mysql-community-common-5.7.33-1.el6.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.33-1.el6.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.33-1.el6.x86_64.rpm
rpm -ivh mysql-community-client-5.7.33-1.el6.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.33-1.el6.x86_64.rpm
rpm -ivh mysql-community-embedded-5.7.33-1.el6.x86_64.rpm
rpm -ivh mysql-community-embedded-devel-5.7.33-1.el6.x86_64.rpm
rpm -ivh mysql-community-server-5.7.33-1.el6.x86_64.rpm --nodeps
rpm -ivh mysql-community-test-5.7.33-1.el6.x86_64.rpm --nodeps
2.2 配置/etc/my.cnf配置文件并启动(两节点执行)
备份:
[root@linux_128 soft]# cp /etc/my.cnf /etc/my.cnf_bak
[root@linux_128 soft]# echo>/etc/my.cnf
修改配置:
[root@linux_128 soft]# vi /etc/my.cnf
节点1配置
[client]
socket=/var/lib/mysql/mysql.sock
default-character-set=utf8
[mysqld]
server-id=1
init-connect='SET NAMES utf8'
default-storage-engine=INNODB
character-set-server=utf8
datadir=/soft/mysql
socket=/var/lib/mysql/mysql.sock
#assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#validate_password=off
explicit_defaults_for_timestamp=true
skip-grant-tables
lower_case_table_names=1
log-bin=/soft/mysql/log_bin
log-bin-index=/soft/mysql/log_bin.index
slow_query_log = 1
slow_query_log_file = /soft/mysql/slowlog/mysql_slow_query.log
long_query_time = 3
relay-log = /soft/mysql/relaylog/relay-log
auto_increment_offset = 1
auto_increment_increment = 2
节点2配置
[client]
socket=/var/lib/mysql/mysql.sock
default-character-set=utf8
[mysqld]
server-id=2
init-connect='SET NAMES utf8'
default-storage-engine=INNODB
character-set-server=utf8
datadir=/soft/mysql
socket=/var/lib/mysql/mysql.sock
#assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#validate_password=off
explicit_defaults_for_timestamp=true
skip-grant-tables
lower_case_table_names=1
log-bin=/soft/mysql/log_bin
log-bin-index=/soft/mysql/log_bin.index
slow_query_log = 1
slow_query_log_file = /soft/mysql/slowlog/mysql_slow_query.log
long_query_time = 3
relay-log = /soft/mysql/relaylog/relay-log
auto_increment_offset = 1
auto_increment_increment = 2
三、初始化服务及启动
3.1 初始化集群(两节点执行)
---添加全局变量
echo "export PATH=/usr/local/mysql/bin:$PATH">> /etc/profile
source /etc/profile
---初始化集群
mysqld --initialize --user=mysql
初始成功会在/etc/my.cnf配置文件中配置的datadir=/data/mysql目录生成文件。

3.2 生成ssl密钥(两节点执行)
mysql_ssl_rsa_setup --basedir=/usr/local/mysql --datadir=/soft/mysql/
3.3 防火墙关闭或开放端口(两节点执行)
关闭防火墙
关服务 systemctl stop firewalld.service
关自动启动 systemctl disable firewalld.service
修改配置强制自动关闭 vi /etc/selinux/config修改标红内容
#This file controls the state of SELinux on the system.
#SELINUX= can take one of these three values:
#enforcing - SELinux security policy is enforced.
#permissive - SELinux prints warnings instead of enforcing.
#disabled - No SELinux policy is loaded.
SELINUX=disabled
#SELINUXTYPE= can take one of these two values:
#targeted - Targeted processes are protected,
#mls - Multi Level Security protection.
SELINUXTYPE=targeted
----立即生效
setenforce 0
3.4 启动服务且配置开机启动(两节点执行)
检查文件夹属主
检查/var/lib/ 下mysql相关文件夹属性,需mysql用户mysql属主
ls -lsa /var/lib|grep mysql
---如果用户:属主不是mysql,则变更一下权限即可
Chown –R mysql:mysql 文件名
检查/var/run/ 下mysqld相关文件夹属性,需mysql用户mysql属主
ls -lsa /var/run/|grep mysql
---如果用户:属主不是mysql,则变更一下权限即可
Chown –R mysql:mysql 文件名
启动服务
在目录/etc/rc.d/init.d 启动service mysqld start
四、登入数据库及设置密码
4.1 登入设置密码(两节点执行)
登入 mysql -uroot 进入sql命令界面

如下sql为修改root用的密码为tellhow#20
步骤一:
mysql –uroot
use mysql
update user set authentication_string=PASSWORD('tellhow') where user="root";
flush privileges;
步骤二:
去除配置中的免密登入 /etc/my.cnf 中的skip-grant-tables
vi /etc/my.cnf
找到文件中的skip-grant-tables参数
在前面加#号或者直接去除即可
---------重新启动服务
cd /etc/rc.d/init.d
service mysqld stop
service mysqld start
步骤三:
在SQL命令行执行
mysql -uroot –ptellhow
mysql> use mysql :会报错,输入以下命令再次修改
mysql> SET PASSWORD = PASSWORD('tellhow');
4.1 设置客户端登入(两节点执行)
进入sql命令界面,执行如下sql后,可用工具连接navicat等工具连数据库。\
mysql>use mysql
mysql> update user set host = '%' where user ='root';
mysql> flush privileges; 刷新配置
五、配置双节点及添加复制进程
5.1双节点创建复制账号
如创建账号为rep 密码为123456, 节点1为15.20 节点2为15.21
节点一:mysql> grant replication slave,replication client on *.* to 'rep'@'%' identified by '123456';
节点二:mysql> grant replication slave,replication client on *.* to 'rep'@'%' identified by '123456';
5.2双节点配置复制账号权限
节点一配置节点二的复制账号
节点二配置节点一的复制账号
执行之前要加参数到/etc/my.cnf
relay-log =/data/mysql/relaylog ##指定 MySQL 中继日志存储路 径
relay-log-index=/data/mysql/relaylog.index
并重启服务,service mysqld restart
查看master status 目前文件名及文件号
登入sql提示界面,执行show master status;
log_bin.000003
727
将查到的文件名及文件号带入下列要执行的语句
节点一:
mysql> change master to master_host='192.168.15.21',master_port=3306,master_user='rep',master_password='123456',master_log_file='log_bin.000003',master_log_pos =727;
重点注意:节点一的命令参数值都是使用节点二机器的数据,例如:
master_log_file='log_bin.000003'
在节点二上执行如下命令,来获取log_in.000003这个值:
Show master status;
节点二:
mysql> change master to master_host='192.168.15.20',master_port=3306,master_user='rep',master_password='123456',master_log_file='log_bin.000003',master_log_pos =727;
重点注意:节点二的命令参数值都是使用节点一机器的数据,例如:
master_log_file='log_bin.000003'
在节点一上执行如下命令,来获取log_in.000003这个值:
Show master status;
5.3启动复制进程
---启动复制线程,并核实(2台master操作一致)
mysql> start slave;
---查看复制进程状态
mysql> show slave status\G;
Slave_IO_Running: Yes ##Yes 表示 10 线程远程连接 ok
Slave_SQL_Running: Yes ##SQL线程表示重放中继日志OK
Seconds _Behind„Master: 0 ##主从延时

从数据库IO和SQL均为YES,则表示正常
5.4 测试是否能够写入数据
之前不是在128主机上插入88张表数据,若是实现主从那么129主机上应该对应会自动同步88张表
但实际上从库并无法中binlog重放读取到创建数据库那个port点,故会出现以下情况
###检查129上是否有数据
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
###而128主机上仍然后数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| th_dep |
+--------------------+
这里可能就有疑问了,明明显示的IO和SQLIO都是yes,但其实是你配置那个port点刚好他们的位置一致,若是你删除主库的thdep,则出现以下情况
mysql> mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.128
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: sql_1_128.000002
Read_Master_Log_Pos: 511
Relay_Log_File: linux_129-relay-bin.000004
Relay_Log_Pos: 454
Relay_Master_Log_File: sql_1_128.000002
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1008
Last_Error: Error 'Can't drop database 'th_dep'; database doesn't exist' on query. Default database: 'th_dep'. Query: 'drop database th_dep'
提示无法删除数据库,但其实从库压根就没有同步过来数据库。
修复办法:1. 先将从库上的slave停止,2. 在从库上创建数据库th_dep,3. 从库启动slave。当前面执行完第二步时,回去看主库上也发现报同样的错。由于是双主,节点二上的th_dep会自动同步到节点一上,节点一先把slave停止,再把th_dep删除,再次启动slave。你会发现双主上的slave均为YES,那么现在就可以把刚才导出的数据库重新导入,导入完成后,你依次查看两台主机上均有th_dep数据库。
###128 主机测试插入库
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
###129 主机上可以查看到
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
| th_dep |
+--------------------+
###129 主机上创建表
mysql> use test;
mysql> create table ttt(id int,name char(20));
###128 主机上查询
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| ttt |
+----------------+
mysql> select * from ttt;
Empty set (0.00 sec)
5.5 模拟故障后数据库是否能够读写数据
###128 主机上数据库宕机
[root@linux_128 ~]# service mysqld stop
Shutting down MySQL............ SUCCESS!
###129 主机插入数据
mysql> insert into ttt values(1,"jjj2"),(2,"qq");
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from ttt;
+------+------+
| id | name |
+------+------+
| 1 | jjj2 |
| 2 | qq |
+------+------+
###128 主机数据库恢复
[root@linux_128 ~]# service mysqld start
Starting MySQL. SUCCESS!
mysql> select * from test.ttt;
+------+------+
| id | name |
+------+------+
| 1 | jjj2 |
| 2 | qq |
+------+------+
可以看到数据库重启后,主库重放了binlog文件,数据依旧能同步。
六、lave_IO_Running 为connecting的故障情况排查
通常在对mysql配置主从或双主配置时,会出现Java_IO_Running为connecting状态,针对这种情况,一般通过如下几个方向去排查:
6.1网络不通
测试双方网络是否互通,使用ping 对象主机IP
6.2户密码错误
双节点配置复制账号时,填写的master_XXX参数必须是对方机器的,其中用户、密码是否配置错误。

6.3防墙未关闭
service iptables status 检测防火墙是否已经关闭
6.4mysql配置文件问题
Cat /etc/my.cnf
检查所有结点配置文件中的server-id是否相同,因为这两个结点的server-id必须不同才有效
本文详细介绍了在RED HAT 7.6环境下,如何搭建MySQL双主集群,包括环境准备、安装配置、初始化服务、配置复制进程以及应对Java_IO_Running为connecting的故障排查方法。通过设置双节点复制账号权限,确保数据在两个节点间同步。
1332

被折叠的 条评论
为什么被折叠?



