【文档】mysql5.7 多主多从架构实现
一、角色划分
1、Mysql数据库规划
主机名 | IP地址 | 角色 | Mysql_server_id |
---|---|---|---|
master01 | 172.16.59.21 | masterA | 21 |
master02 | 172.16.59.22 | masterB | 22 |
slave01 | 172.16.59.23 | slaveA | 23 |
slave02 | 172.16.59.24 | slaveB | 24 |
二、初始化环境配置
## 1.修改主机名(各主机分别操作)
hostnamectl set-hostname master01
hostnamectl set-hostname master02
hostnamectl set-hostname slave01
hostnamectl set-hostname slave02
## 2.添加主机名的域名解析(所有节点操作)
cat <<EOF > /etc/hosts
172.16.59.21 master01
172.16.59.22 master02
172.16.59.23 slave01
172.16.59.24 slave02
EOF
三、编译部署数据库
参考链接:https://blog.csdn.net/sinat_33982461/article/details/85887378
## 1.下载mysql.tar.gz安装包
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz
## 2.解压安装包至opt目录下并重命名
tar -xzvf mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz -C /opt
mv /opt/mysql-5.7.34-linux-glibc2.12-x86_64 /opt/mysql5.7
## 3.创建mysqlu用户和组
groupadd mysql && useradd -g mysql mysql
mkdir -p /opt/mysql5.7/{data,tmp,logs}
## 4.修改 my.cnf配置文件
cat <<EOF > /etc/my.cnf
[mysqld]
server-id=1
socket=/opt/mysql5.7/tmp/mysql.sock
character-set-server=utf8
datadir=/opt/mysql5.7/data
log_bin=/opt/mysql5.7/logs/mysql-bin
expire_logs_days=10
lower_case_table_names=1
[client]
socket=/opt/mysql5.7/tmp/mysql.sock
EOF
## 5.修改 mysql.server配置文件
vi /opt/mysql5.7/support-files/mysql.server
46 basedir=/opt/mysql5.7
47 datadir=/opt/mysql5.7/data
### 5.1 拷贝启动文件到系统服务目录
cp /opt/mysql5.7/support-files/mysql.server /etc/init.d/mysql
### 5.2 修改目录及文件权限
chown -R mysql:mysql /opt/mysql5.7
chown mysql:mysql /etc/my.cnf
chown mysql:mysql /etc/init.d/mysql
# 6.添加全局环境变量
cat <<EOF >> /etc/profile
MYSQL_HOME=/opt/mysql5.7
export PATH="\$PATH:\$MYSQL_HOME/bin:"
EOF
source /etc/profile
## 7.初始化MySQL数据库
### 7.1初始化数据库
su - mysql
mysqld --initialize --user=mysql --basedir=/opt/mysql5.7 --datadir=/opt/mysql5.7/data --socket=/opt/mysql5.7/tmp/mysql.sock >>/opt/mysql5.7/logs/install.log 2>&1
### 7.2查看数据库密码
cat /opt/mysql5.7/logs/install.log | grep 'root@localhost' | awk -F ':' '{print $4}'
### 7.3启动并进入数据库密码
service mysql start
mysql -uroot -p
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('1234,abcd');
## 8.开机自启
chkconfig --add mysql
chkconfig --level 345 mysql on
五、修改my.cnf文件进行双主配置
配置文件详情可参阅 MySQL参考手册
[mysqld]
server-id=22
socket=/opt/mysql5.7/tmp/mysql.sock
character-set-server=utf8
datadir=/opt/mysql5.7/data
# MySQL的日志文件的名字
log_bin=/opt/mysql5.7/logs/mysql-bin
expire_logs_days=10
lower_case_table_names=1
binlog_format=MIXED
log-slave-updates=1
auto-increment-increment=2
auto-increment-offset=2 #起始位置设置为2
# MySQL的日志文件的名字
log-bin=mysql_bin
# 作为从库时 更新操作是否写入日志 on:写入 其他数据库以此数据库做主库时才能进行同步
log-slave-updates=on
# MySQL系统库的数据不需要同步 我们这里写了3个 更加保险
# 同步数据时忽略一下数据库 但是必须在使用use db的情况下才会忽略;如果没有使用use db 比如create user 数据还是会同步的
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
# 使用通配符忽略MySQL系统库的表 这样在create user时也不会进行同步了
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=sys.%
# MySQL系统库的日志不计入binlog 这样更加保险了
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
[client]
socket=/opt/mysql5.7/tmp/mysql.sock
1.Master01配置
[mysqld]
server-id=21
socket=/opt/mysql5.7/tmp/mysql.sock
character-set-server=utf8
datadir=/opt/mysql5.7/data
log_bin=/opt/mysql5.7/logs/mysql-bin
expire_logs_days=10
lower_case_table_names=1
log-bin=mysql-bin
binlog_format=MIXED
log-slave-updates=1
auto-increment-increment=2
auto-increment-offset=1 #起始位置设置为1
[client]
socket=/opt/mysql5.7/tmp/mysql.sock
2.Master02配置
[mysqld]
server-id=22
socket=/opt/mysql5.7/tmp/mysql.sock
character-set-server=utf8
datadir=/opt/mysql5.7/data
log_bin=/opt/mysql5.7/logs/mysql-bin
expire_logs_days=10
lower_case_table_names=1
log-bin=mysql-bin
binlog_format=MIXED
log-slave-updates=1
auto-increment-increment=2
auto-increment-offset=2 #起始位置设置为2
[client]
socket=/opt/mysql5.7/tmp/mysql.sock
3.双主配置
## 重启并进入mysql
service mysql restart
mysql -uroot -p
## 授权对方访问数据库
grant replication slave on *.* to 'replm'@'172.16.59.21' identified by 'huangyuefeng';
flush privileges;
SELECT user,host FROM mysql.user;
## 查看对方master主机的binlog和pos
show master status;
...
| mysql-bin.000002 | 154 |
...
## 配置对方的binlog和pos
CHANGE MASTER TO
MASTER_HOST='172.16.59.21',
MASTER_USER='replm',
MASTER_PASSWORD='huangyuefeng',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=154;
## 启动备份并查看状态
start slave;
show slave status\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
六、为每台主节点配置从节点
1.Master01配置
## 授权从机访问连接
grant replication slave on *.* to 'repl'@'172.16.59.23' identified by 'huangyuefeng';
flush privileges;
show master status;
| mysql-bin.000007 | 1683 |
2.Master02配置
## 授权从机访问连接
grant replication slave on *.* to 'repl'@'172.16.59.24' identified by 'huangyuefeng';
flush privileges;
show master status;
| mysql-bin.000007 | 1683 |
3.Slave01配置
CHANGE MASTER TO
MASTER_HOST='172.16.59.21',
MASTER_USER='repl',
MASTER_PASSWORD='huangyuefeng',
MASTER_LOG_FILE='mysql-bin.000007',
MASTER_LOG_POS=1683;
start slave;
show slave status\G
4.Slave02配置
CHANGE MASTER TO
MASTER_HOST='172.16.59.22',
MASTER_USER='repl',
MASTER_PASSWORD='huangyuefeng',
MASTER_LOG_FILE='mysql-bin.000007',
MASTER_LOG_POS=1683;
start slave;
show slave status\G