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
这里写图片描述
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号