MySQL-双主高可用


主服务器
开启binlog日志
[mysqld]
log-bin=master
log-bin-index=master
server-id=1
1.全备:
[root@localhost data]# mysqldump -u root -p123 --all-databases > /tmp/all.sql

2.将全备拷贝给从机,并在从机完全恢复,保证主从数据的一致性

3.授权从机可以从主机复制数据
mysql> grant replication slave on *.* to slave@'192.168.10.201' identified by '123';

4.查看主服务器日志状态:
mysql> show master status\G
*************************** 1. row ***************************
File: master.000001
Position: 120
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

从服务器
1.完全恢复
[root@localhost mysql]# mysql -u root < /root/all.sql

2.测试登陆主服务器
[root@localhost mysql]# mysql -u slave -p123 -h 192.168.10.200

3.配置文件
[root@localhost data]# cat /etc/my.cnf
[mysqld]
server-id=2

4.配置连接服务器
mysql> change master to
-> master_host='192.168.10.200',
-> master_user='slave',
-> master_password='123',
-> master_log_file='master.000001',
-> master_log_pos=120;
mysql> start slave;
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

调换两台主机的身份再做一次
从服务器:
开启binlog日志:
[root@localhost data]# cat /etc/my.cnf
[mysqld]
server-id=2
log-bin=slave
log-bin-index=slave

给主服务器授权
mysql> grant replication slave on *.* to master@'192.168.10.200' identified by '123' ;


主服务器:
mysql> change master to
-> master_host='192.168.10.201',
-> master_user='master',
-> master_password='123',
-> master_log_file='slave.000001',
-> master_log_pos=333;

mysql> start slave;
mysql> show slave status\G

=====================================================
在mysql互主的基础上配置keepalived(两台mysql都要安装)
root@localhost smb]# tar -xvf keepalived-1.2.24.tar.gz -C /usr/local/src/
[root@localhost ~]# cd /usr/local/src/keepalived-1.2.24/
[root@localhost keepalived-1.2.24]#./configure --prefix=/ --mandir=/usr/local/share/man/
[root@localhost keepalived-1.2.24]# make
[root@localhost keepalived-1.2.24]# make install
[root@localhost keepalived-1.2.24]# cd /etc/keepalived/
! Configuration File for keepalived

global_defs { #全局定义主要设置 keepalived 的通知机制和标识
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id test
}

vrrp_instance VI_1 { #VRRP(虚拟路由冗余协议)实例配置
state MASTER #另一个 Director 标记为 BACKUP!!!
interface eth0 #实例绑定的网卡
virtual_router_id 51 #VRID 虚拟路由标识 00-00-5e-00-01-{VRID}
priority 150 #优先级高为master,master 至少要高于 backup 50 !!!
advert_int 1 #检查间隔
authentication {
auth_type PASS 验证:主备之间做身份验证 主备之间一定一致
auth_pass 1111
}
virtual_ipaddress { 浮动ip
192.168.10.222/24
}
}

==================================================

virtual_server 192.168.0.200 3306 {
delay_loop 2 #每个2秒检查一次real_server状态
lb_algo wrr #LVS算法
lb_kind DR #LVS模式
persistence_timeout 60 #会话保持时间
protocol TCP
real_server 192.168.0.219 3306 {
weight 3
notify_down /usr/local/MySQL/bin/MySQL.sh #检测到服务down后执行的脚本
TCP_CHECK {
connect_timeout 10 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 3306 #健康检查端口
}
}
}
====================================================

 

[root@localhost keepalived]# scp keepalived.conf 192.168.10.201:/etc/keepalived/
拷贝后,修改配置文件
state BACKUP
priority 100

2台mysql上,启动Keepalived服务
[root@localhost keepalived]# service keepalived start


测试2台mysql的故障转移

==================================
MYSQL ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.10.210' (111) 解决方法

今天在测试MySQL的连接时候,发现连接不通过,并报错ERROR 2003 (HY000): Can't connect to mysql server on '192.168.10.210' (111)
测试代码:

require 'mysql2'
client = Mysql2::Client.new(:host=>"192.168.10.210",:username=>'root',:password=>"root")
puts results = client.query("show databases;")

谷歌了一下之后,原来是在mysql的my.cnf中有下面一段代码:

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 127.0.0.1 #这里默认监听本地localhost

如果要让mysql监听到其他的地址,可以将bind-address = 127.0.0.1注释掉。
或者将bind-address = 0.0.0.0监听所有的地址

屏蔽掉之后再次运行代码又出现:Host '192.168.10.83' is not allowed to connect to this MySQL server
这里写图片描述
解决方法:
如果想让192.168.10.83能够连接到本地的这个数据库,要让数据库给其分配权限,登录mysql,执行:(username 和 password是登录mysql的用户名和密码)

GRANT ALL PRIVILEGES ON *.* TO 'username'@'192.168.10.83' IDENTIFIED BY 'password' WITH GRANT OPTION;

如果要想所有的外部ip地址都能够访问使用mysql,可以执行下面:

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

之后执行刷新数据库:

flush privileges;

如果要查看用户的权限,可以执行:

> show grants for 'root'@192.168.10.83

这里写图片描述

posted @ 2018-11-19 17:28  木易-故事里的人  阅读(296)  评论(0编辑  收藏  举报