数据库mysql集群主从、高可用MGR、MHA技术详解

一、安装数据库mysql步骤

环境:红帽7.9系统

安装依赖

yum install cmake gcc-c++ openssl-devel  ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 -y

将下载的MySQL软件包解压并cd到mysql的目录下

[root@mysql-node10 ~]# tar zxf mysql-boost-5.7.44.tar.gz

[root@mysql-node10 ~]# cd /root/mysql-5.7.44

源码编译模块

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=/root/mysql-5.7.44/boost/boost_1_59_0

make -j2 (这里的数字要等于或小于你的虚拟机上的内核数量)

make install

二、部署mysql

切换到mysql软件目录下

[root@pxe ~]# cd /usr/local/mysql/

创建一个数据库的用户

[root@pxe mysql]# useradd -s /sbin/nologin -M mysql

创建mysql的数据目录

[root@pxe mysql]# mkdir /data/mysql -p

给数据目录赋权

[root@pxe mysql]# chown mysql.mysql -R /data/mysql

生成启动脚本

[root@pxe mysql]# cd support-files/

[root@pxe support-files]# cp mysql.server /etc/init.d/mysqld

编辑配置文件

[root@pxe support-files]# vim /etc/my.cnf

[mysqld]

datadir=/data/mysql              #指定数据目录

socket=/data/mysql/mysql.sock        #指定套接字

symbolic-links=0                    #数据只能存放到数据目录中,禁止链接到数据目录

添加环境变量

[root@pxe support-files]# vim ~/.bash_profile

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

        . ~/.bashrc

fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/usr/local/mysql/bin

export PATH

执行脚本

[root@pxe support-files]# source ~/.bash_profile

数据库初始化建立基本数据

[root@pxe support-files]# mysqld --user mysql --initialize

localhost: 10WPQGxQHTh6(D  207fL4w3Czsp(T

[root@pxe support-files]# cd

将初始密码保存

[root@pxe ~]# vim passwd

启动mysql

[root@pxe ~]# /etc/init.d/mysqld start

Starting MySQL.Logging to '/data/mysql/pxe.err'.

 SUCCESS!

通过命令启动数据库指定级别,这里默认启动2345

[root@pxe ~]# chkconfig mysqld on

[root@pxe ~]# chkconfig --list

mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off

安全初始化

[root@pxe ~]# mysql_secure_installation

Enter password for user root:  输入初始密码passwd里面保存的

New password:设置新密码

Re-enter new password:再输入一遍新密码

Press y|Y for Yes, any other key for No: no

Change the password for root ? ((Press y|Y for Yes, any other key for No) : no

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y

Success.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y

Success.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

登录测试

[root@pxe ~]# mysql -uroot -p

Enter password:123

mysql> show databases

    -> ;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

+--------------------+

4 rows in set (0.00 sec)

三、mysql的主从复制

3.1无数据添加slave

设置主从id

[root@mysqlnode1 local]# vim /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=10

log-bin=mysql-bin

重启数据库

[root@mysql-node1 mysql]# /etc/init.d/mysqld restart

Shutting down MySQL. SUCCESS!

Starting MySQL. SUCCESS!

[root@mysql-node2 mysql]# vim /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=20

[root@mysql-node2 mysql]#  /etc/init.d/mysqld restart

Shutting down MySQL.. SUCCESS!

Starting MySQL. SUCCESS!

配置master

[root@mysql-node1 mysql]# mysql -uroot -p

进入数据库配置用户权限

生成专门用来做复制的用户,用于slave端做认证用

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY '123';

Query OK, 0 rows affected (0.00 sec)

对用户进行授权

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';

Query OK, 0 rows affected (0.00 sec)

查看master的状态

mysql> SHOW MASTER STATUS;

+------------------+----------+--------------+------------------+-------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 |     1151 |              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

mysql> show master status\G

*************************** 1. row ***************************

             File: mysql-bin.000001

         Position: 1151

     Binlog_Do_DB:

 Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.00 sec)

配置slave

mysql> change master to master_host='172.25.254.10',master_user='repl',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=1151;——设置master

Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

查看slave的状态

mysql>  SHOW SLAVE STATUS\G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 172.25.254.10

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000001

          Read_Master_Log_Pos: 1151

               Relay_Log_File: mysql-node2-relay-bin.000002

                Relay_Log_Pos: 320

        Relay_Master_Log_File: mysql-bin.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

在master上插入数据测试:

mysql> create database jcl;

Query OK, 1 row affected (0.01 sec)

mysql> create table jcl.userlist(

    -> username varchar(10) not null,

    -> password varchar(50) not null

    -> );

Query OK, 0 rows affected (0.00 sec)

mysql> insert into jcl.userlist values ('jjj1','111');

Query OK, 1 row affected (0.02 sec)

mysql> select * from jcl.userlist

    -> ;

+----------+----------+

| username | password |

+----------+----------+

| jjj1     | 111      |

+----------+----------+

1 row in set (0.00 sec)

在20主机上可以看到数据

mysql> select * from jcl.userlist;

+----------+----------+

| username | password |

+----------+----------+

| jjj1     | 111      |

+----------+----------+

1 row in set (0.00 sec)

注:

在主数据库中添加数据后从数据库上会更新,但是从数据库添加数据主数据库这边是不会看到的。

3.2有数据添加slave

将mysql文件同步到node3上

[root@mysql-node1 mysql]# rsync -al /usr/local/mysql root@172.25.254.30:/usr/local

从master节点备份数据

[root@mysql-node1 mysql]# mysqldump -uroot -p jcl > jcl.sql

Enter password:

[root@mysql-node1 mysql]# scp jcl.sql root@172.25.254.30:/mnt

root@172.25.254.30's password:

jcl.sql                                         100% 1944     3.4MB/s   00:00

在node3上创建用户和数据目录

[root@mysql-node3 local]# useradd -s /sbin/nologin -M mysql

[root@mysql-node3 local]# mkdir -p /data/mysql

[root@mysql-node3 local]# chown -R mysql.mysql /data/mysql/

[root@mysql-node3 local]# vim /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=30

[root@mysql-node3 local]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

[root@mysql-node3 local]# vim ~/.bash_profile

具体内容参考以上MySQL的部署

[root@mysql-node3 local]# source ~/.bash_profile

初始化数据库

[root@mysql-node3 local]# mysqld --user=mysql --initialize

[root@mysql-node3 ~]# /etc/init.d/mysqld start

Starting MySQL.Logging to '/data/mysql/mysql-node3.err'.

 SUCCESS!

安全初始化

[root@mysql-node3 ~]# mysql_secure_installation

[root@mysql-node3 ~]# cd /mnt

利用master节点中备份出来的jcl.sql在slave2中拉平数据

[root@mysql-node3 mnt]# mysql -uroot -p123 -e "create database jcl;"

mysql: [Warning] Using a password on the command line interface can be insecure.

[root@mysql-node3 mnt]# mysql -uroot -p123 jcl < jcl.sql

mysql: [Warning] Using a password on the command line interface can be insecure.

配置slave2的slave功能

[root@mysql-node3 mnt]# mysql -uroot -p123

mysql> change master to master_host='172.25.254.10',master_user='repl',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=1794;

Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;

Query OK, 0 rows affected (0.01 sec)

测试查看master的数据

mysql> select * from jcl.userlist;

+----------+----------+

| username | password |

+----------+----------+

| jjj1     | 111      |

+----------+----------+

1 row in set (0.00 sec)

3.3延迟复制

在slave2上设置延迟复制

mysql> stop slave sql_thread;

Query OK, 0 rows affected (0.00 sec)

mysql> change master to master_delay=60;

Query OK, 0 rows affected (0.00 sec)

mysql> start slave sql_thread;

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;

SQL_Delay: 60

在主数据库上删除一条信息

mysql> delete from jcl.userlist where username='jjj1';

Query OK, 1 row affected (0.00 sec)

mysql> select * from jcl.userlist;

+----------+----------+

| username | password |

+----------+----------+

| ccc      | 222      |

+----------+----------+

1 row in set (0.00 sec)

在30从数据库上因为做了延迟,所以还是看的我们删除的信息

mysql> select * from jcl.userlist;

+----------+----------+

| username | password |

+----------+----------+

| jjj1     | 111      |

| ccc      | 222      |

+----------+----------+

2 rows in set (0.01 sec)

3.4慢查询日志

慢查询就是当执行SQL超过long_query_time参数设定的时间阈值的语句。

查看慢查询参数

mysql> SHOW variables  like "slow%";

+---------------------+----------------------------------+

| Variable_name       | Value                            |

+---------------------+----------------------------------+

| slow_launch_time    | 2                                |

| slow_query_log      | OFF                              |

| slow_query_log_file | /data/mysql/mysql-node3-slow.log |

+---------------------+----------------------------------+

3 rows in set (0.00 sec)

开启慢查询日志

mysql> SET GLOBAL slow_query_log=ON;

Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES like "long%";

+-----------------+-----------+

| Variable_name   | Value     |

+-----------------+-----------+

| long_query_time | 10.000000 |

+-----------------+-----------+

1 row in set (0.01 sec)

查看慢查询是否开启

mysql> SHOW VARIABLES like "slow%";

+---------------------+----------------------------------+

| Variable_name       | Value                            |

+---------------------+----------------------------------+

| slow_launch_time    | 2                                |

| slow_query_log      | ON                               |

| slow_query_log_file | /data/mysql/mysql-node3-slow.log |

+---------------------+----------------------------------+

3 rows in set (0.00 sec)

查看慢查询日志

[root@mysql-node3 mnt]# cat  /data/mysql/mysql-node3-slow.log

/usr/local/mysql/bin/mysqld, Version: 5.7.44 (Source distribution). started with:

Tcp port: 3306  Unix socket: /data/mysql/mysql.sock

Time                 Id Command    Argument

慢查询测试:

mysql> select sl

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值