河南龙祥软件科技有限公司
He Nan Long Xiang Software Technology Co., Ltd.
24小时服务热线:18236995786
查看计算机名称:hostnamectl
修改计算机名称:hostnamectl set-hostname 新名称
计算机名称文件:/etc/hostname,那个/etc/hosts文件中修改了没有起作用。
如果修改了计算机名称,在远程连接别的数据库时会使用计算机名代替ip地址,此时需要把ip地址和计算机名添加到/etc/hosts文件中,否则访问不了,更改后重启计算机才会生效。
效果:
127.0.0.1 localhost
::1 localhost
192.168.40.90 node1
192.168.40.91 node2
192.168.40.92 node3
将端口加入防火墙:firewall-cmd --zone=public --add-port=33061/tcp --permanent #permanent是永久生效的意思,如果没有这个参数,重启服务器就不生效了,设置好后重启防火墙生效。
重启防火墙:systemctl restart firewalld.service
查看防火墙开启的端口:firewall-cmd --list-all
把3306端口也加入到防火墙中,否则后面单主模式时从节点连接主节点需要登录时会报错连接不上。
安装mysql数据库服务版:yum install mysql-server;
查看数据库版本号:mysql -V
show plugins;可以查看安装的数据库插件。
mysql的日志文件mysqld.log如果被删掉了,重新启动一下mysql服务就会自动生成一个,手动创建的文件不起作用。
创建数据库并设置数据库编码和规则:create database zufuzhi1 default charset utf8 collate utf8_general_ci;
创建表:CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名',
`age` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表';
主从数据库:
所有数据库的server-id不能相同。UUID不能相同。
如果是服务器版,修改my.cnf.d文件夹下的mysql-server.cnf文件,在mysqld下面添加配置信息。如果是数据库版,则是在my.cnf文件中的mysqld下面添加配置信息。
配置文件位置:/etc/my.cnf(数据库版)、/etc/my.cnf.d/mysql-server.cnf(数据库服务器版)
主从数据库的配置文件的[mysqld]下都增加:server-id=1(后面的1根据情况设置,各数据库之间不能相同)。
启动mysql服务:systemctl start mysqld,systemctl status mysqld可以查看数据库状态。
使用命令查看临时密码:cat /var/log/mysqld.log | grep password,这个是数据库版的位置,服务器版的位置是/var/log/mysql/mysqld.log,注意区别,有些版本的数据库默认密码是空。
进行安全初始化:mysql_secure_installation,执行这个操作会让选择密码强度,0是超过8位,1是数字、大小写、特殊符号组合,2是文件方式,一般选1,设置密码和重复输入密码后进行后续的设置分别是:移除匿名用户、禁止远程登录、移除测试库、刷新授权表,全部选是,都是在进行一些安全措施。
使用账号密码登录数据库:mysql -uroot -p
查看数据库:show databases;
查看表:show tables;
创建用户并授权:
create user 'zhao'@'192.168.40.%' identified by 'ZHANGsan123!@#'; ##创建用户,用户名是zhao,这个用户在ip地址为192.168.40网段的服务器上可以远程登录这个数据库,密码是ZHANGsan123!@#。
grant replication slave on *.* to 'zhao'@'192.168.40.%'; ##授权为可以复制master(主数据库)节点数据的slave(从数据库)节点,ip地址为192.168.40网段的服务器上的从数据库可以使用zhao这个用户复制主数据库上的数据。
##replication:表示复制权限。*.*:表示对所有库的所有表都授权。zhao:用户名。192.168.40.%:授权192.168.40网段的所有数据库节点都可以同步(复制)
flush privileges; ##刷新。
show master status; ##查看master节点的状态,记住File值(日志文件名称)和Position值(日志文件位置),后面使用。
展示结果:
+-------------------+-----------+----------------+-------------------+--------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+-----------+----------------+-------------------+--------------------+
| mysql-bin.000001 | 769 | | | |
+-------------------+-----------+----------------+-------------------+--------------------+
在从数据库1服务器上查看主服务器配置是否正常:mysql -h 192.168.40.1 -uzhao -pZHANGsan123!@#,这是使用主数据库授权的用户远程登录主数据库,可以登录进数据库说明主数据库配置正常,使用查看数据库命令看不到重要信息。
异步复制(基于bin日志)
主数据库有改变数据的操作后,会生成日志,然后把日志发送给所有从数据库,从数据库得到日志后执行相同的操作,如果从数据库执行失败,后面都不会继续执行。
在slave(从数据库)节点上配置主节点master(主数据库)的信息,并开启:
mysql> change master to
-> master_host='192.168.40.90', ##master节点IP
-> master_user='zhao', ##设置连接主数据库的用户。
-> master_password='ZHANGsan123', ##设置连接主数据库的用户的密码。
-> master_log_file='mysql-bin.000001', ##要复制的文件名称。
-> master_log_pos=769; ##要复制的文件位置。
启动slave:start slave; 启动后从节点才会执行从主数据库复制日志的操作。
查看slave的执行结果:show slave status\G; 会展示执行复制的主数据库地址、复制文件名称、复制文件位置等信息,还有复制结果,如果Slave_IO_Running和Slave_SQL_Running都是Yes,说明执行成功了,如果有一个是No,就要查看是什么原因并处理,在last_error里有最后一条错误的提示信息。如果最后的参数是\g,也能查到信息,只不过展示的形式不一样。在此之后,主数据库上执行了什么操作,从数据库都会进行同步,如果在执行某一步失败了,比如因为从表数据和主表不一致出现了失败,就需要恢复到和主表执行那一步前一致再执行。
查看日志中的内容:mysqlbinlog mysql-bin.000001。首先要进入日志文件中,在/var/lib/mysql文件夹中。
基于二进制文件位置的主从复制会因为master一个事件的中断而造成数据丢失进而不能复制。
异步复制(基于事务标识GTID)
主数据库有改变数据的操作后,会生成事务,然后把事务发送给所有从数据库,从数据库得到事务信息后执行相同的操作。如果从数据库执行这个事务中有操作失败,则回滚到执行事务之前,后面的都不回继续处理。
基于gtid的主从复制不会因为master一个事件的中断而造成数据丢失而不能复制。
配置主从数据库的配置文件:
gtid_mode=ON
enforce-gtid-consistency=ON
在从数据库上开始配置主节点master的信息,并开启:
mysql> stop slave; ##停止slave。
mysql> change master to
-> master_host='192.168.40.90', ##设置master节点IP
-> master_user='zhao', ##设置连接主数据库的用户。
-> master_password='ZHANGsan123', ##设置连接主数据库的用户的密码。
-> master_auto_position=1; ##从第一条事务开始跟踪。
开启slave:start slave;
此时在主数据库上进行操作,从数据库会自动同步。
查看slave的执行结果:show slave status\G; Retrieved_Gtid_Set和Executed_Gtid_set有值时说明执行成功了。
在从数据库中查看gtid信息:select * from mysql.gtid_executed;
半同步复制
需要安装一个mysql内部插件,然后激活,如果是临时安装,则重启数据库后这个功能将会关闭,要实现永久开启可以写在配置文件中。
主数据库执行一条改变操作时,先将操作发给所有从数据库,有任意一个从数据库接收到操作并返回信号,主数据库才会执行这个操作。否则主数据库在等待超过10秒后就不等从数据库了,直接执行,第二次再执行就不等10秒直接执行,半同步复制在一次失败后会自动切换为异步复制,等从数据库启动后会将没做过的操作做一遍,然后才开始以半同步方式继续进行。
在主从数据库上安装半同步复制插件:install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
检测插件是否正确安装:
select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%'; #看到plugin_name下面有rpl_semi_sync_master,状态是ACTIVE时说明正常。
激活插件:set global rpl_semi_sync_master_enabled=1; 如果是这样临时的安装和激活,每次重启数据库都要重新激活一下。
查看插件激活状态:show variables like 'rpl_semi_sync%'; #当看到rpl_semi_sync_slave_enabled的值是ON时,说明激活成功了,如果启动了io进程,会看到参数rpl_semi_sync_master_timeout,这个值默认是10秒,是主数据库等待从数据库响应的超时时间。
重启io进程:stop slave io_thread; start slave io_thread; #如果启动不成功,说明两端的数据不同步,要先处理同步了才可以。
在主数据库查看状态:show status like '%rpl%'; Rpl_semi_sync_master_clients后面的值是等待同步的从数据库数量
全同步复制(组复制)
组复制支持单主模型和多主模型两种工作方式(默认是单主模型)
单主模型:从复制组中众多个MySQL节点中自动选举一个master几点,只有master节点可以写,其他节点自动设置为只读,当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其它slave将指向这个新的master。
多主模型:多主复制通常是环形复制,在环中的每个节点都作为主库,每个主库都可以拥有多个备库。复制组中的任何一个节点都可以写,因此没有master和slave的概念。
组复制的效率很低:当master节点写数据的时候,会等待所有的slave节点完成数据的复制,然后才继续往下进行,组复制的每一个节点都可能是slave。
查看服务器90的数据库uuid,在/var/lib/mysql/auto.cnf文件中。用这个uuid作为三个数据库的组名,组名必须是一个UUID格式的值,因为三个数据库的uuid不能和这个组名一样,所以90服务器上的数据库uuid要重新生成一个。
先停止mysql服务:systemctl stop mysqld,再清空/var/lib/mysql文件夹下的所有文件和文件夹,所有的数据库信息都在这里包括root的密码。启动mysql服务:systemctl start mysqld。此时就会重新生成一个uuid。
如果之前配置过异步复制的slave信息,要在mysql里清除这些配置信息,用:reset slave;
如果要清除主配置信息,用:reset master;
设置配置文件/etc/my.cnf.d/mysql-server.cnf:
server_id=1 #所有数据库的配置文件中这个值不能相同。
gtid_mode=ON #开启基于事务GTID的复制功能。
enforce_gtid_consistency=ON #开启GTID功能
master_info_repository=TABLE #MGR需要多源复制功能,所以需要将主从库之间的信息记录到表中。
relay_log_info_repository=TABLE #同上
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW #基于行规则复制。
plugin_load_add='group_replication.so' #安装组复制插件
transaction_write_set_extraction=XXHASH64 #指示服务器对于每个事务,它必须手机写集并使用XXHASH64散列算法将其编码为散列,从mysql8.0.2开始,此设置是默认设置,可以省略。
loose-group_replication_group_name='3be1d3c9-d7e5-11ec-9244-000c29949fef' #组名称,必须是uuid格式的值,上面记录的那个可以拿过来用,也可以用select uuid()生成一个。
loose-group_replication_start_on_boot=OFF #配置自动加入组,这在设置组复制时很重要,因为它确保您可以在手动启动插件之前配置服务器。配置成功后,可以设置这个参数为ON,以便在数据库启动后自动启动Grop_Replication。
loose-group_replication_local_address="192.168.40.90:33061" #设置本机的ip地址和监听端口,这个IP地址是外网地址,如果不是一个网段的地址,会出现连不上的问题,此时可以用ifconfig命令看到的普通网卡的名称,这里是【eth0】,执行命令:ifconfig eth0:1 **.**.**.**【这里的**.**.**.**是外网地址】。报错内容:"Timeout while waiting for the group communication engine to be ready!"
"The group communication engine is not ready for the member to join. Local port: 33061"
loose-group_replication_group_seeds="192.168.40.90:33061,192.168.40.91:33061,192.168.40.92:33061" #所有组复制的节点ip及它们的监听端口,这里也是写外网地址。
loose-group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="127.0.0.1/8,192.168.40.0/24" #把指定网段的ip加入白名单中,如果是指定ip地址就直接写,如果是一个范围内就写范围。
loose-group_replication_single_primary_mode=OFF #这个参数决定是单主(ON)还是多主(OFF),默认单主。
# 在多主模式下部署时,将检查语句以确保他们与该模式兼容。在多主模式下部署组复制时,将进行以下检查:
# --如果事务是在SERIALIZABLE隔离级别下执行的,则在与组同步时,其提交将失败。
# --如果事务是针对具有级联约束的外键的表执行的,则该事务在与组同步时将无法提交。
# 这些检查可以通过设置选项来禁用group_replication_enforce_update_everywhere_checks到OFF。在单主模式下部署时,此选项必须设置为OFF。
loose-group_replication_enforce_update_everywhere_checks=ON
单主模式:
如果所有的节点都被停止,且设置的自动启动组复制,则开启一个节点后,会自动启动组复制,但是它找不到主节点,所以会启动失败,此时就需要先运行使用配置参数的语句进行初始化,然后再启动组复制,这时候这个节点就成了主节点,后面所有节点数据库启动后,因为能找到主节点且能连上,所以就会正常启动组复制。
设置配置文件中:loose-group_replication_single_primary_mode=ON
loose-group_replication_enforce_update_everywhere_checks=OFF
启动mysql服务。
查看root用户的初始密码,mysql8的初始密码是空,直接输入mysql就可以进去,其它的查看方法:cat /var/log/mysqld.log | grep password。
进入mysql。
修改root用户密码【选择使用】:alter user root@localhost identified by 'XIAOzhao123';
在所有节点数据库中执行:
set sql_log_bin=0; #关闭日志功能,新建用户的操作不想让其它节点获取。
create user zhao@'%' identified by 'Zhao123!@#'; #新建用户zhao,权限是%表示任何位置都可以远程登录,密码是Zhao123!@#。
grant replication slave on *.* to zhao@'%'; #为用户zhao增加复制权限。
flush privileges; #刷新。
set sql_log_bin=1; #开启日志功能。
change master to master_user='zhao',master_password='Zhao123!@#' for channel 'group_replication_recovery'; #配置通道信息和用户信息。
set global group_replication_bootstrap_group=on; #开启配置参数,这一句只在第一个节点执行,其他节点都会直接用这里配置的信息。执行这个语句的节点会成为主节点。
start group_replication; #启动组复制功能。
set global group_replication_bootstrap_group=off; #关闭配置参数,这一句只在第一个节点执行。
select * from performance_schema.replication_group_members; #查看节点是否部署成功,状态是ONLINE就说明是正常的,其他状态都是有问题。
# PRIMARY表示这个是主节点,SECONDARY表示这个是从节点。
最终效果:
+-------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBR_STATE | MEMBER_ROLE | MEMBER_VERSION |
+-------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+
| group_replication | 861ab148-df63-11ec-8832-000c2980ed69 | node1 | 3306 | ONLINE | PRIMARY | 8.0.26 |
| group_replication | ac3b5585-df63-11ec-8e33-000c29614740 | node2 | 3306 | ONLINE | SECONDARY | 8.0.26 |
| group_replication | bd129ac6-df63-11ec-bd99-000c295647bd | node3 | 3306 | ONLINE | SECONDARY | 8.0.26 |
+-------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+
停止组复制功能:stop group_replication;如果是主数据库停止了,则下一个从数据库会自动转换为主数据库,这个曾经的主数据库重新启动后会变成从数据库。
如果查询部署的节点发现从数据库的MEMBER_STATE状态值为RECOVERING(恢复),说明主数据库有和从数据库不一样的数据且没有被写入执行日志中,所以从数据库比较出来差异了但是找不到原始数据执行,所以就一直处于恢复状态了。
如果配置文件中写安装插件了,就不用再执行那个安装语句了,否则安装的时候会显示这个功能已经存在。
在启动组复制功能:start group_replication;时一直报错,有一次在日志文件中看到提示:Error connecting to the local group communication engine instance,解决方式是修改/etc/selinux/config文件中的SELINUX=disabled,这个好像是关闭安全策略,需要看有没有开启后还能启动的方式,原始值是:enforcing。
启动组复制时要先清除master的配置,用reset master命令。还要停止从数据库的slave。不然会启动不起来还报错。
设置为单主模式后,从数据库服务器会被自动设置为只读状态,不可在从数据库服务器里进行增删改操作,执行select @@read_only;语句可以查看数据库只读状态。
数据库为只读状态时执行增删改语句会提示错误信息:ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
如果在navicat中连接上mysql后发现只有一个数据库information_schema,说明当前用户没有太多权限。
执行语句:show grants for zhao;可以查看用户zhao的权限。
执行语句:grant all privileges on *.* to zhao;可以为用户zhao设置所有权限,此时重新连接mysql就可以看到别的数据库了。
思考,四种复制方法,如果主从数据库的数据不一致了,应该怎么处理呢?
解决方案:如果是组复制模式,因为无法改变日志节点编号,所以只能是先备份binlog日志,然后进入数据库执行reset master;命令初始化binlog日志,停止数据库服务(防止持续被写入数据),然后备份数据库,再然后启动数据库,不影响主数据库的使用。最后到从数据库中执行备份文件,再开启组复制模式,此时从数据库就会从主库的binlog日志中重新同步数据了。
注意:如果不是使用mysql命令创建数据库,binlog日志中不会出现创建数据库的语句,同步的时候可能会出现未知的数据库错误,在遇到这种情况时可以在从数据库里创建好查不到的那个数据库,然后同步,具体试过一次,没有成功。
多主模式:
多主模式中所有的数据库节点都是主节点,任何一个主节点中执行了增删改操作,其它节点都会同步。
设置配置文件中:loose-group_replication_single_primary_mode=OFF
loose-group_replication_enforce_update_everywhere_checks=ON
后面的和单主都一样。查询的效果:
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 0d7db34a-55bc-11ed-a4b6-000c29aea539 | node2 | 3306 | ONLINE | PRIMARY | 8.0.26 |
| group_replication_applier | 3d08144f-55ba-11ed-aef4-000c29d562d5 | node1 | 3306 | ONLINE | PRIMARY | 8.0.26 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
友情链接 LINKS
扫码加微信
关注公众号