1、主从复制及主主复制的实现
- 主从复制的实现:
Master(主服务器)CentOS8-10.0.8.18:
#安装数据库
yum install -y mysqld
#修改配置文件
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
#增加以下几行
server-id=18
log-bin=/data/mysql/nologin/mysql-bin #CentOS8默认开启二进制。二进制存放路径/data/mysql/nologin。(mkdir /data/mysql/nologin/ -p ;chown -R mysql:mysql /data/mysql/nologin/ )
#启动服务
systemctl start mysqld
进入数据库:
#查看数据库中的二进制文件和位置
show master logs;
mysql-bin.000001 | 156 |
#创建复制用户
create user 'repluser'@'10.0.8.%';
#赋予该用户所有权限
grant replication slave on *.* to 'repluser'@'10.0.8.%';
Slave(从服务器)CentOS8-10.0.8.28:
#安装数据库
yum install -y mysqld
#修改配置文件
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
#增加该行
server-id=28
#启动服务
systemctl start mysqld
进入数据库:
#执行以下命令
CHANGE MASTER TO MASTER_HOST='10.0.8.18',
MASTER_USER='repluser',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=156;
#启动线程
start slave;
#查看状态
show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 10.0.8.18
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 618
Relay_Log_File: CS8-VM8-10-relay-bin.000002
Relay_Log_Pos: 786
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 618
Relay_Log_Space: 1000
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0 #复制的延迟时间
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 18
Master_UUID: 65794410-e24e-11ec-b1a1-000c299f142d
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set, 1 warning (0.01 sec)
- 主主复制的实现(互为主从关系):
主节点1(Master1)CentOS8-10.0.8.18:
yum install -y mysqld
#修改配置文件
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
#增加以下几行
server-id=18
log-bin=/data/mysql/nologin/mysql-bin
#重启服务
systemctl restart mysqld
进入数据库:
#查看数据库中的二进制文件和位置
show master logs;
mysql-bin.000001 | 156 |
创建账号并赋予权限:
create user repluser@'10.0.8.%' identified by "000000";
grant replication slave on *.* to repluser@"10.0.8.%";
然后在主节点2上执行
CHANGE MASTER TO....(该步骤在主节点2上)
CHANGE MASTER TO
MASTER_HOST='10.0.8.28',
MASTER_USER='repluser',
MASTER_PASSWORD='000000',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=695;
#start slave;
#show slave status\G
...
Slave_IO_State: Waiting for source to send event
Master_Host: 10.0.8.28
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 695
Relay_Log_File: CS8-VM8-10-relay-bin.000002
Relay_Log_Pos: 324
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
Master_Retry_Count: 86400
...
主节点2(Master2)CentOS8-10.0.8.28:
yum install -y mysqld
#修改配置文件
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
#增加以下几行
server-id=28
log-bin=/data/mysql/nologin/mysql-bin
#重启服务
systemctl restart mysqld
进入数据库:
执行以下命令
CHANGE MASTER TO
MASTER_HOST='10.0.8.18',
MASTER_USER='repluser',
MASTER_PASSWORD='000000',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=156;
#start slave;
#show slave status\G
...
Slave_IO_State: Waiting for source to send event
Master_Host: 10.0.8.18
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 681
Relay_Log_File: CS8-VM8-10-relay-bin.000002
Relay_Log_Pos: 849
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
Master_Retry_Count: 86400
...
#查看数据库中的二进制文件和位置
show master logs;
mysql-bin.000001 | 695 |
(然后再主节点1,同样执行CHANGE MASTER TO....)
验证:
在主节点1中执行:mysql> create database db1;
在主节点2中查询:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| db1 |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
2、xtrabackup实现全量+增量+binlog恢复库
xtrabackup执行完毕:出现"completed OK!"代表命令执行成功。
源主机CentOS8-10.0.8.18:
#安装对应的软件
yum install -y percona-xtrabackup-80-8.0.28-21.1.el8.x86_64.rpm
#建立备份的相应目录
mkdir /backup/
#开启数据库
systemctl start mysqld
#导入数据库
mysql < hellodb_innodb.sql
#完全备份
xtrabackup -uroot --backup --target-dir=/backup/base
#进入数据库
mysql
#第一次修改数据
mysql> insert teachers values(null,'ZS','16','F');
#第一次增量备份
xtrabackup -uroot --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base
#第二次修改数据
mysql> insert teachers values(null,'LS','18','M');
#第二次增量备份
xtrabackup -uroot --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
#把源主机的备份(完全备份加两次增量备份)拷贝到目标主机(CentOS8-10.0.8.28)。目标主机应该要有/backup该目录,否则在此之前应该先建立该文件夹。
scp -r /backup/* 10.0.8.28:/backup/
目标主机CentOS8-10.0.8.28还原:
#安装对应的软件
yum install -y percona-xtrabackup-80-8.0.28-21.1.el8.x86_64.rpm
#还原完全备份(选项--apply-log-only 阻止回滚未完成的事务)
xtrabackup --prepare --apply-log-only --target-dir=/backup/base
#还原第一次增量备份至完全备份中
xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1
#还原第二次增量备份至完全备份中(最后一次还原该选项--apply-log-only不需要)
xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2
#复制到数据库目录中。(数据库目录应该为空且MYSQL服务不能够启动。如果目录不为空,则:systemctl stop mysqld ; rm rf /var/log/mysql/*。)
xtrabackup --copy-back --target-dir=/backup/base
#属性还原
chown -R mysql:mysql /var/lib/mysql
#启动服务
systemctl start mysqld
验证:
mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | ZS | 16 | F |
| 6 | LS | 18 | M |
+-----+---------------+-----+--------+
6 rows in set (0.00 sec)
3、MyCAT实现MySQL读写分离
本实验四台机器,都在CS8上操作:客户端(10.0.8.8)、mycat服务器(10.0.8.38)、Master(10.0.8.18)、Slave(10.0.8.28)
主从复制参照上文。
客户端(10.0.8.8):
#使用默认端口登录:
mysql -uroot -p123456 -h 10.0.8.38 -P8066
#查看数据库
show databases;
+----------+
| DATABASE |
+----------+
| TESTDB | 有TESTDB虚拟数据库,说明连接成功
#切换数据库
mysql> use TESTDB; #TESTDB虚拟数据库映射会主动映射成真正数据库hellodb( 真正数据库在Master主服务器上/apps/mycat/conf/schema.xml定义了)
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 #(说明切换成功)
#测试读写操作
select * from teachers;
insert teachers values(5,'wang',30,'M');
------------------------------------------------------------------------------
#从节点停止服务时:
mysql> select * from teachers;
ERROR 2013 (HY000): Lost connection to MySQL server during query
No connection. Trying to reconnect...
Connection id: 10
Current database: TESTDB
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | wang | 30 | M |
+-----+---------------+-----+--------+
5 rows in set (0.03 sec)
mycat服务器(10.0.8.38):内存3G以上
#下载并安装Mycat
wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
#解压缩至指定文件夹/apps/中
mkdir /apps/
tar vxf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps/
#安装java
yum install -y java
#加入环境变量
echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
. /etc/profile.d/mycat.sh
--------------------------------------------------------------------------
mycat
file /apps/mycat/bin/mycat
--------------------------------
#启动mycat服务
mycat start
#查看是否启动成功
tail -f /apps/mycat/logs/wrapper.log
INFO | jvm 1 | 2022/06/20 21:59:20 | MyCAT Server startup successfully. see logs in logs/mycat.log #mycat服务开启成功
#修改配置文件,实现读写分离:
vim /apps/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"
dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="hellodb" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1"
slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="host1" url="10.0.8.18:3306" user="root"
password="123456"> #Master应该创建相对应的账号(root)、密码(123456)。
<readHost host="host2" url="10.0.8.28:3306" user="root"
password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
#重启服务
mycat restart
successfully. see logs in logs/mycat.log #mycat服务重启成功
#查看端口:(8066------Mycat默认端口)
[10:15:47 root@CS8-VM8-10 ~][#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 1 127.0.0.1:32000 0.0.0.0:*
LISTEN 0 128 0.0.0.0:111 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 5 127.0.0.1:631 0.0.0.0:*
LISTEN 0 128 0.0.0.0:32919 0.0.0.0:*
LISTEN 0 50 *:1984 *:*
LISTEN 0 100 *:8066 *:*
LISTEN 0 50 *:39267 *:*
LISTEN 0 70 *:33060 *:*
LISTEN 0 100 *:9066 *:*
LISTEN 0 128 *:3306 *:*
LISTEN 0 128 [::]:111 [::]:*
LISTEN 0 50 *:42099 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 5 [::1]:631 [::]:*
LISTEN 0 128 [::]:57787 [::]:*
Master(10.0.8.18):
根据Mycat服务器中/apps/mycat/conf/schema.xml,创建用户并授权。
create user root@'10.0.8.%' identified by '123456';
grant all on *.* to root@'10.0.8.%';
#开启通用日志,并写入配置文件
开启通用日志:
show variables like 'general%';
set global general_log=1 ;
通用日志存放位置:/var/lib/mysql/master.log (/var/lib/mysql/CS8-VM8-10.log)
tail -f /var/lib/mysql/master.log
写入配置文件:
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
general_log=ON
#重启服务
systemctl restart mysqld
#查看通用日志
tail -f /var/lib/mysql/CS8-VM8-10.log
...
2022-06-21T07:29:50.444592Z 39 Query select user() #select user()健康行检查
2022-06-21T07:30:00.442737Z 42 Query select user()
2022-06-21T07:30:10.442440Z 37 Query select user()
2022-06-21T07:30:10.687383Z 35 Query insert teachers values(5,'wang',30,'M') #记入写操作
Slave(10.0.8.28):
#开启通用日志,并写入配置文件
开启通用日志:
show variables like 'general%';
set global general_log=1 ;
通用日志存放位置:/var/lib/mysql/slave.log (/var/lib/mysql/CS8-VM8-10.log)
tail -f /var/lib/mysql/master.log
写入配置文件:
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
general_log=ON
#重启服务
systemctl restart mysqld
#查看通用日志
tail -f /var/lib/mysql/CS8-VM8-10.log
...
2022-06-21T07:29:50.443860Z 11 Query select user()
2022-06-21T07:29:50.753241Z 10 Query select * from teachers
2022-06-21T07:29:51.607792Z 12 Query select * from teachers #记入读操作
...
注:本实验使用默认端口8066登录。
4、ansible常用模块介绍
#查看帮助:
ansible-doc --help
#统计目前的所有模块(-l ),并计数(wc -l):
ansible-doc -l | wc -l
#查看某模块的帮助:
ansible-doc [-s] module_name --help
ansible:
**ansible <host-pattern> [-m module_name] [-a args]**
1.command(在远程主机执行命令,默认模块,-m选项可省略。不支持某些特定符号:<、>、|、&等,可能用shell模块实现。此模块不具有幂等性。)
例:
ansible webservers -m command -a 'chdir=/etc cat centos-release'
2. shell (和command相似,用shell执行命令,支持各种符号,比如:*,$, >。此模块不具有幂等性。 )
例:
ansible webservers -m shell -a "echo $HOSTNAME"
3. script(在远程主机上运行ansible服务器上的脚本(无需执行权限);此模块不具有幂等性)
例:
ansible websrvs -m script -a /data/test.sh
4. copy(从ansible服务器主控端复制文件到远程主机;src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件)
例:
#如果目标文件存在,默认覆盖(应该先备份)
ansible websrvs -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh owner=wang
mode=600 backup=yes"
#指定内容,直接生成目标文件
ansible websrvs -m copy -a "content='test line1\ntest line2\n'
dest=/tmp/test.txt"
5. get_url(用于将文件从http、https或ftp下载到被管理机节点上)
6. fetch(从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录)
例:
ansible websrvs -m fetch -a 'src=/root/test.sh dest=/data/scripts'
7.file (设置文件属性,创建软链接等)
例:
#创建空文件:
ansible all -m file -a 'path=/data/test.txt state=touch'
ansible all -m file -a 'path=/data/test.txt state=absent'
#创建目录
ansible all -m file -a "path=/data/mysql state=directory owner=mysql
ansible all -m file -a 'path=/data/testdir state=directory'
#创建软链接
ansible all -m file -a 'src=/data/testfile path|dest|name=/data/testfile-link state=link'
8. stat(检查文件或文件系统的状态--Windows用win_stat模块)
例:
ansible 127.0.0.1 -m stat -a 'path=/etc/passwd'(path是绝对路径)
9. unarchive(解包解压缩)
方法一:将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes,此为默认值,可省略
方法二:将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
例:
ansible all -m unarchive -a 'src=/data/foo.tgz dest=/var/lib/foo owner=wang group=bin'
ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/data copy=no'
ansible all -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=0777'
10. archive(打包压缩保存在被管理节点)
例:
ansible websrvs -m archive -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=wang mode=0600'
11. hostname(管理主机名)
例:
ansible 10.0.0.18 -m hostname -a 'name=node18.ncgxy.com'
12. cron(计划任务;支持时间:minute,hour,day,month,weekday)
例:
#创建任务
ansible 10.0.0.8 -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup mysql" job=/root/mysql_backup.sh'
#禁用计划任务
ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime disabled=yes"
#启用计划任务
ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime disabled=no"
#删除任务
ansible websrvs -m cron -a "name='backup mysql' state=absent"
ansible websrvs -m cron -a 'state=absent name=Synctime'
13. yum和apt模块
yum 管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本
apt 模块管理 Debian 相关版本的软件包
例:
#安装
ansible websrvs -m yum -a 'name=httpd state=present'
(state=absent 删除 )
ansible websrvs -m yum -a 'name=sl,cowsay'
#启用epel源安装
ansible websrvs -m yum -a 'name=nginx state=present enablerepo=epel'
14. yum_repository
15. service(管理服务)
例:
ansible all -m service -a 'name=httpd state=started enabled=yes'
(state=started/stoped/reloaded/restarted)
16. user(管理用户)
例:
#创建用户
ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
ansible all -m user -a 'name=nginx comment=nginx uid=88 group=nginx groups="root,daemon" shell=/sbin/nologin system=yes create_home=no home=/data/nginx non_unique=yes'
#删除用户(remove=yes表示删除用户及家目录等数据,默认remove=no)
ansible all -m user -a 'name=nginx state=absent remove=yes'
17. group(管理组)
例:
#创建组
ansible websrvs -m group -a 'name=nginx gid=88 system=yes'
#删除组
ansible websrvs -m group -a 'name=nginx state=absent'
18. lineinfile(相当于sed,可以修改文件内容)
一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块。
regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最
后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被
删除。
如果想进行多行匹配进行替换需要使用replace模块
例:
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"
19. replace(上同)
20. selinux(管理SELInux策略)
21. reboot
ansible websrvs -m reboot
22. mount挂载和卸载(挂载和卸载文件系统)
23. setup(setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度)
gather_facts: no禁止ansible收集facts信息
例:ansible all -m setup
ansible all -m setup -a "filter=ansible_nodename"
("filter=ansible_hostname"、"filter=ansible_domain"、"filter=ansible_memtotal_mb"、
"filter=ansible_memory_mb"、 "filter=ansible_memfree_mb"、"filter=ansible_os_family"
)
("filter=ansible_distribution_major_version"
"filter=ansible_distribution_version"
"filter=ansible_processor_vcpus"
"filter=ansible_all_ipv4_addresses"
"filter=ansible_architecture"
"filter=ansible_uptime_seconds"
"filter=ansible_processor*"
''filter=ansible_env'')
24. debug(此模块可以用于输出信息,并且通过 msg 定制输出的信息内容,msg后面的变量有时需要加 " " 引起来
)