Home Database Mysql Tutorial mysql高可用方案之Keepalived+主主复制

mysql高可用方案之Keepalived+主主复制

Jun 07, 2016 pm 02:56 PM
mysql Available plan High availability

环境规划: node1: 192.168.1.250 node2: 192.168.1.251 vip: 192.168.1.201 数据库: mysql-5.6.23 mysqldba技术群 378190849 武汉-linux运维群 236415619 1.各节点的网络配置 node1节点: [root@node1 ~]# hostname node1 [root@node1 ~]# ip addr 1: lo: LOO

环境规划:

node1:    192.168.1.250 

node2:    192.168.1.251

vip:      192.168.1.201

数据库:   mysql-5.6.23


mysql dba技术群 378190849

武汉-linux运维群 236415619


1.各节点的网络配置

node1节点:

[root@node1 ~]# hostname
node1
[root@node1 ~]# ip addr
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 10:78:d2:c9:50:28 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.250/24 brd 192.168.1.255 scope global eth0
    inet6 fe80::1278:d2ff:fec9:5028/64 scope link
       valid_lft forever preferred_lft forever
[root@node1 ~]#


node2节点:

[root@node2 ~]# hostname
node2
[root@node2 ~]# ip addr
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc mq state UP qlen 1000
    link/ether d0:27:88:7d:83:9b brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.251/24 brd 192.168.1.255 scope global eth0
    inet6 fe80::d227:88ff:fe7d:839b/64 scope link
       valid_lft forever preferred_lft forever
[root@node2 ~]# 


2.下载安装mysql数据库

node1节点和node2节点一样安装(下面红色部分不一样)

[root@node1 ~]# wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.23-linux-glibc2.5-x86_64.tar.gz

[root@node1 ~]# tar xvf mysql-5.6.23-linux-glibc2.5-x86_64.tar.gz  -C /usr/local/

[root@node1 ~]# cd /usr/local/
[root@node1 local]# mv mysql-5.6.23-linux-glibc2.5-x86_64  mysql-5.6.23   
[root@node1 local]# chown  -R root:mysql mysql-5.6.23/
[root@node1 local]# chown  -R mysql:mysql mysql-5.6.23/data/
[root@node1 local]# cd mysql-5.6.23/
[root@node1 mysql-5.6.23]# ./scripts/mysql_install_db  --user=mysql --group=mysql --database=/usr/local/mysql-5.6.23/data --basedir=/usr/local/mysql-5.6.23
[root@node1 mysql-5.6.23]# cp -a my.cnf  /etc/
[root@node1 mysql-5.6.23]# cp -a support-files/mysql.server  /etc/init.d/mysqld
[root@node1 mysql-5.6.23]# vim /etc/my.cnf

basedir = /usr/local/mysql-5.6.23
datadir = /usr/local/mysql-5.6.23
port = 3306
server_id = 10                       --将另一台主修改为20
socket = /tmp/mysql.sock

log-bin=mysql-bin
log-bin-index=mysql-bin-index

replicate-do-db=tong
replicate-ignore-db=mysql

auto_increment_offset=1              --将另一台主修改为2
auto_increment_increment=2

relay-log=relay-log
relay-log-index=relay-log-inde

log_slave_updates
sync-binlog=1

[root@node1 mysql-5.6.23]# /etc/init.d/mysqld restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL. SUCCESS!
[root@node1 mysql-5.6.23]#


3.配置主主复制

node1节点:

[root@node1 mysql-5.6.23]# /usr/local/mysql-5.6.23/bin/mysqladmin -u root password 'system'  --修改初始密码为system
Warning: Using a password on the command line interface can be insecure.
[root@node1 mysql-5.6.23]# /usr/local/mysql-5.6.23/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.23-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database tong;
Query OK, 1 row affected (0.05 sec)

mysql> grant replication slave,replication client on *.* to repl_user@'192.168.1.251' identified by 'system!#%246';         --创建复制用户
Query OK, 0 rows affected (0.05 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.05 sec)

mysql> show master status;    --查看node1节点的二进制位置
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      690 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql>


node2节点:

[root@node2 mysql-5.6.23]# /usr/local/mysql-5.6.23/bin/mysqladmin  -u root password 'system'
Warning: Using a password on the command line interface can be insecure.

[root@node2 mysql-5.6.23]# /usr/local/mysql-5.6.23/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.23-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database tong;
Query OK, 1 row affected (0.03 sec)

mysql> grant replication slave,replication client on *.* to repl_user@'192.168.1.250' identified by 'system!#%246';
Query OK, 0 rows affected (0.06 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)

mysql> change master to master_host='192.168.1.250',master_port=3306,master_user='repl_user',master_password='system!#%246',master_log_file='mysql-bin.000001',master_log_pos=690;    --同步node1的数据
Query OK, 0 rows affected, 2 warnings (0.39 sec)

mysql> show master status;         --查看node2节点的二进制日志
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      690 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.03 sec)

mysql> 


node1节点:

mysql> change master to master_host='192.168.1.251',master_port=3306,master_user='repl_user',master_password='system!#%246',master_log_file='mysql-bin.000001',master_log_pos=690;    --同步node2节点的数据
Query OK, 0 rows affected, 2 warnings (0.49 sec)

mysql> start slave;
Query OK, 0 rows affected (0.08 sec)

mysql>


4.测试主主同步是否正常(在两个节点各写一行数据,在两个节点查看数据)

node1节点:

mysql> \u tong
Database changed
mysql> create table t (a int);
Query OK, 0 rows affected (0.33 sec)

mysql> insert into t values(1);
Query OK, 1 row affected (0.08 sec)

mysql>


node2节点:

mysql> \u tong
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from t;
+------+
| a    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> insert into t values(2);
Query OK, 1 row affected (0.12 sec)

mysql> select * from t;
+------+
| a    |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

mysql>


node1节点:

mysql> select * from t;
+------+
| a    |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

mysql>


5.下载安装keepalived软件(node1和node2是一样)

node1节点:

[root@node1 ~]# wget http://www.keepalived.org/software/keepalived-1.2.15.tar.gz

[root@node1 ~]# tar xvf keepalived-1.2.15.tar.gz
[root@node1 ~]# cd keepalived-1.2.15

[root@node1 keepalived-1.2.15]# ./configure --prefix=/usr/local/keepalived-1.2.15 --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64

[root@node1 keepalived-1.2.15]# make && make install

[root@node1 keepalived-1.2.15]# echo $?
0
[root@node1 keepalived-1.2.15]# cd /usr/local/keepalived-1.2.15/

[root@node1 keepalived-1.2.15]# ll
total 16
drwxr-xr-x. 2 root root 4096 Apr 30 11:46 bin
drwxr-xr-x. 5 root root 4096 Apr 30 11:46 etc
drwxr-xr-x. 2 root root 4096 Apr 30 11:46 sbin
drwxr-xr-x. 3 root root 4096 Apr 30 11:46 share

[root@node1 keepalived-1.2.15]# mkdir /etc/keepalived       --创建文件夹不能少,否则出错

[root@node1 keepalived-1.2.15]# cp -a etc/rc.d/init.d/keepalived  /etc/init.d/

[root@node1 keepalived-1.2.15]# cp -a etc/keepalived/keepalived.conf  /etc/keepalived

[root@node1 keepalived-1.2.15]# cp -a etc/sysconfig/keepalived  /etc/sysconfig/

[root@node1 keepalived-1.2.15]# cd /etc/keepalived/                  
[root@node1 keepalived]# vim keepalived.conf 

! Configuration File for keepalived

global_defs {
   notification_email {
     z597011036@qq.com           --邮件报警
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1        --邮件服务器
   smtp_connect_timeout 30      --连接超时30秒报警
   router_id mysql-ha          
}

vrrp_instance VI_1 {
    state MASTER            --主节点是MASTER,备节点是BACKUP
    interface eth0
    virtual_router_id 50    --id值在两台服务器必须一至
    priority 100            --优先级,node1是100,node2是90
    advert_int 1
    nopreempt               --不抢占资源
    authentication {
        auth_type PASS      --两个节点认证的权限
        auth_pass 1111
    }
    virtual_ipaddress {     --VIP地址
        192.168.1.201
    }
}

virtual_server 192.168.1.201 3306 {    --VIP地址和端口
    delay_loop 6
    lb_algo wrr              --权纵
    lb_kind DR               --DR模式
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP             --协议

    real_server 192.168.1.250 3306 {    --node1的IP地址和端口
        weight 1
        notify_down /usr/local/mysql-5.6.23/bin/mysql.sh    --检测mysql宕机后执行的脚本
        TCP_CHECK {
            connect_timeout 3    --连接超时
            nb_get_retry 3       --重试3秒
            connect_port 3306    --连接端口

        }
    }
}

[root@node1 keepalived]# cat /usr/local/mysql-5.6.23/bin/mysql.sh    --脚本内容
#!/bin/bash
pkill keepalived
/usr/bin/keepalived -D
[root@node1 keepalived]# 


node2节点:

安装keepalived软件是一样

[root@node2 keepalived]# vim keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     z597011036@qq.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id mysql-ha
}

vrrp_instance VI_1 {
    state BACKUP                 --与node1不一样
    interface eth0
    virtual_router_id 50
    priority 99                   --与node1不一样
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.201
    }
}

virtual_server 192.168.1.201 3306 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.251 3306 {       --node2的IP地址和端口
        weight 1
        notify_down /usr/local/mysql-5.6.23/bin/mysql.sh
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            connect_port 3306
        }
    }

}

[root@node1 keepalived]# cat /usr/local/mysql-5.6.23/bin/mysql.sh    --脚本内容
#!/bin/bash
pkill keepalived
/usr/bin/keepalived -D
[root@node1 keepalived]#


6.启动服务和测试状态

node1节点和node1节点:

[root@node2 keepalived]# /etc/init.d/mysqld restart    --两个节点启动服务
 ERROR! MySQL server PID file could not be found!
Starting MySQL. SUCCESS!
[root@node2 keepalived]# /etc/init.d/keepalived restart   --两个节点启动服务
Stopping keepalived:                                       [FAILED]
Starting keepalived:                                       [  OK  ]
[root@node2 etc]# /usr/local/mysql-5.6.23/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.23-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> grant all privileges on *.* to remote@'%' identified by 'system';     --在两个节点创建相同的远程登陆用户
Query OK, 0 rows affected (0.07 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)

mysql>


node2节点:

[root@node2 keepalived]# ip addr show
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc mq state UP qlen 1000
    link/ether d0:27:88:7d:83:9b brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.251/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.201/32 scope global eth0           --VIP地址在node2已经启动
    inet6 fe80::d227:88ff:fe7d:839b/64 scope link
       valid_lft forever preferred_lft forever
[root@node2 keepalived]# 


用mysql客户端登陆VIP地址:

[root@node3 keepalived]# /usr/local/mysql-5.6.23/bin/mysql -u remote -p -h 192.168.1.201
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 27
Server version: 5.6.23-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> \u tong
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> create table g (a int);
Query OK, 0 rows affected (0.29 sec)

mysql> insert into g values(1);
Query OK, 1 row affected (0.09 sec)

mysql> select * from g;
+------+
| a    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> exit
Bye
[root@node2 keepalived]# /etc/init.d/mysqld stop    --关闭node2节点的mysql服务
Shutting down MySQL.... SUCCESS!
[root@node2 keepalived]# ip addr show
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc mq state UP qlen 1000
    link/ether d0:27:88:7d:83:9b brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.251/24 brd 192.168.1.255 scope global eth0   --VIP不见了
    inet6 fe80::d227:88ff:fe7d:839b/64 scope link
       valid_lft forever preferred_lft forever
[root@node2 keepalived]#


node1节点:

[root@node1 keepalived]# ip addr show
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 10:78:d2:c9:50:28 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.250/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.201/32 scope global eth0           --VIP在node1启动了
    inet6 fe80::1278:d2ff:fec9:5028/64 scope link
       valid_lft forever preferred_lft forever
[root@node1 keepalived]# 


用mysql客户端登陆VIP地址:

[root@node3 bin]# ./mysql -u remote -p -h 192.168.1.201 -P 3306
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 48
Server version: 5.6.23-log MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> \u tong
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from g;      --数据同步了
+------+
| a    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql>


Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

MySQL's Role: Databases in Web Applications MySQL's Role: Databases in Web Applications Apr 17, 2025 am 12:23 AM

The main role of MySQL in web applications is to store and manage data. 1.MySQL efficiently processes user information, product catalogs, transaction records and other data. 2. Through SQL query, developers can extract information from the database to generate dynamic content. 3.MySQL works based on the client-server model to ensure acceptable query speed.

How to start mysql by docker How to start mysql by docker Apr 15, 2025 pm 12:09 PM

The process of starting MySQL in Docker consists of the following steps: Pull the MySQL image to create and start the container, set the root user password, and map the port verification connection Create the database and the user grants all permissions to the database

Laravel Introduction Example Laravel Introduction Example Apr 18, 2025 pm 12:45 PM

Laravel is a PHP framework for easy building of web applications. It provides a range of powerful features including: Installation: Install the Laravel CLI globally with Composer and create applications in the project directory. Routing: Define the relationship between the URL and the handler in routes/web.php. View: Create a view in resources/views to render the application's interface. Database Integration: Provides out-of-the-box integration with databases such as MySQL and uses migration to create and modify tables. Model and Controller: The model represents the database entity and the controller processes HTTP requests.

Solve database connection problem: a practical case of using minii/db library Solve database connection problem: a practical case of using minii/db library Apr 18, 2025 am 07:09 AM

I encountered a tricky problem when developing a small application: the need to quickly integrate a lightweight database operation library. After trying multiple libraries, I found that they either have too much functionality or are not very compatible. Eventually, I found minii/db, a simplified version based on Yii2 that solved my problem perfectly.

How to install mysql in centos7 How to install mysql in centos7 Apr 14, 2025 pm 08:30 PM

The key to installing MySQL elegantly is to add the official MySQL repository. The specific steps are as follows: Download the MySQL official GPG key to prevent phishing attacks. Add MySQL repository file: rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm Update yum repository cache: yum update installation MySQL: yum install mysql-server startup MySQL service: systemctl start mysqld set up booting

Centos install mysql Centos install mysql Apr 14, 2025 pm 08:09 PM

Installing MySQL on CentOS involves the following steps: Adding the appropriate MySQL yum source. Execute the yum install mysql-server command to install the MySQL server. Use the mysql_secure_installation command to make security settings, such as setting the root user password. Customize the MySQL configuration file as needed. Tune MySQL parameters and optimize databases for performance.

Laravel framework installation method Laravel framework installation method Apr 18, 2025 pm 12:54 PM

Article summary: This article provides detailed step-by-step instructions to guide readers on how to easily install the Laravel framework. Laravel is a powerful PHP framework that speeds up the development process of web applications. This tutorial covers the installation process from system requirements to configuring databases and setting up routing. By following these steps, readers can quickly and efficiently lay a solid foundation for their Laravel project.

MySQL vs. Other Programming Languages: A Comparison MySQL vs. Other Programming Languages: A Comparison Apr 19, 2025 am 12:22 AM

Compared with other programming languages, MySQL is mainly used to store and manage data, while other languages ​​such as Python, Java, and C are used for logical processing and application development. MySQL is known for its high performance, scalability and cross-platform support, suitable for data management needs, while other languages ​​have advantages in their respective fields such as data analytics, enterprise applications, and system programming.

See all articles