一、准备
| 主机 | 作用 | 系统版本 | MySQL版本 |
|---|
| 192.168.9.106 | 主 /从 | CentOS7.6 | MySQL5.7.35 |
| 192.168.9.107 | 从/主 | CentOS7.6 | MySQL5.7.35 |
两台机器安装好 MySQL5.7.35,参考文章如下:
https://blog.csdn.net/CsethCRM/article/details/119418841
二 在 192.168.9.106 (主)上配置
1. 在192.168.9.106(主) 上配置 my.cnf
vim /etc/my.cnf
在 [mysqld] 下边 添加 如下配置:
#开启二进制日志
log-bin=mysql-bin
#任意自然数n,只要保证两台MySQL主机不重复就可以了。
server-id=663
2. 登录 9.106 的MySQL
mysql -u root -p
输入自己的密码
3. 创建 repl 用户,指定该用户只能在主库 192.168.9.106 上使用 Repl123!@# 密码登录
mysql> create user 'repl'@'192.168.9.106' identified by 'Repl123!@#';
4. 为 repl 用户赋予 REPLICATION SLAVE 权限。
mysql> grant replication slave on *.* to 'repl'@'192.168.9.106';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'repl'@'%' IDENTIFIED BY 'Repl123!@#' WITH GRANT OPTION;
5. 查看用户
mysql> select user,host from mysql.user;
6.查看 master 状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
注意:如果遇到 empty set 1.请检查一下配置是否按照示例中106的配置进行配置 2.重启一下MySQL再看看
三、 在 192.168.9.107 (从)上配置
1. 在192.168.9.107(从) 上配置my.cnf
vim /etc/my.cnf
在 [mysqld] 下边 添加 如下配置:
#开启二进制日志
log-bin=mysql-bin
#任意自然数n,只要保证两台MySQL主机不重复就可以了。
server-id=662
2. 配置连接主服务器的信息
mysql -u root -p
输入自己的密码
mysql> change master to master_host='192.168.9.106', master_user='repl',MASTER_PORT =3306,master_password='Repl123!@#',master_log_file='mysql-bin.000002',master_log_pos=154;
注意:
master_log_file 一定要对应 106(主)机器 show master status 中的 File 字段; master_log_pos 一定要对应 106(主)机器 show master status 中的 Position 154
mysql> start slave;
3. 查看状态
mysql> show slave status G
主要看以下消息有两个YES即可 :
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
恭喜您,截止目前,MySQL 主(9.106)从(9.107)已经 配置完成。
在9.106 上的一切操作会近实时 同步到9.107的DB中。
四、MYSQL 主主配置
(把192.168.9.107也配置成作为主,192.168.9.106配置成为从);192.168.9.106 和 192.168.9.107 互为主从;组成 主主
1. 查看状态 - (192.168.9.107上操作):
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 964 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2. 创建 repl 用户,指定该用户只能在主库 192.168.9.106 上使用 Repl123!@# 密码登录 - (192.168.9.107上操作)
mysql> create user 'repl107'@'192.168.9.107' identified by 'Repl123!@#';
3.为 repl 用户赋予 REPLICATION SLAVE 权限 - (192.168.9.107上操作)
mysql> grant replication slave on *.* to 'repl107'@'192.168.9.107';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'repl107'@'%' IDENTIFIED BY 'Repl123!@#' WITH GRANT OPTION;
4.刷新权限 - (192.168.9.107上操作)
Flush privileges;
5.把9.106 设置为9.107的从 - (192.168.9.106上操作)
mysql> change master to master_host='192.168.9.107', master_user='repl107',MASTER_PORT =3306,master_password='Repl123!@#',master_log_file='mysql-bin.000001',master_log_pos=964;
mysql> start slave;
mysql> show slave status G
主要看以下消息有两个YES即可 :
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
截止目前 192.168.9.106 和 192.168.9.107 主主 集群已经成功搭建,两台机器无论在那一台上的增删改查 都会 近实时同步到另一台;
但是还不能做到高可用,如果要做到高可用,继续往下看;
五、利用 Nginx 配置 高可用 主主 负载均衡
1.机器准备
| 主机 | 作用 | 系统版本 | Nginx版本 |
|---|
| 192.168.9.104 | Nginx | Ubuntu16.04 | nginx version: nginx/1.10.3 (Ubuntu) |
注意:9.104上不需要安装 MySQL
2.Nginx 配置 /etc/nginx/nginx.conf
在最后一行添加如下代码即可:
stream {
upstream mysql_proxy{
hash $remote_addr consistent;
server 192.168.9.106:3306 weight=1 max_fails=3 fail_timeout=10s;
server 192.168.9.107:3306 weight=1 max_fails=3 fail_timeout=10s;
}
server {
listen 3306; # 数据库服务器监听端口
proxy_connect_timeout 10s;
proxy_timeout 300s;
proxy_pass mysql_proxy;
}
}
3. 截止目前,Nginx + MySQL 主主 的高可用集群搭建完毕。
附录:
192.168.9.106 my.cnf 配置如图:
[mysqld]
log-bin=mysql-bin
server-id=663
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
192.168.9.107 my.cnf 配置如图:
[mysqld]
log-bin=mysql-bin
server-id=662
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
192.168.9.104 Nginx - nginx.cnf 配置如图:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
stream {
upstream mysql_proxy{
hash $remote_addr consistent;
server 192.168.9.106:3306 weight=1 max_fails=3 fail_timeout=10s;
server 192.168.9.107:3306 weight=1 max_fails=3 fail_timeout=10s;
}
server {
listen 3306; # 数据库服务器监听端口
proxy_connect_timeout 10s;
proxy_timeout 300s;
proxy_pass mysql_proxy;
}
}