第十二周--作业
1、主从复制及主主复制的实现
主从复制实现步骤:
#主节点配置 #server-id唯一不可重复 [root@localhost ~]#vim /etc/my.cnf [mysqld] log-bin server-id=# #查看binlog文件位置 mysql> show master logs; +--------------------+-----------+-----------+ | Log_name | File_size | Encrypted | +--------------------+-----------+-----------+ | centos7-bin.000005 | 180 | No | | centos7-bin.000006 | 157 | No | +--------------------+-----------+-----------+ 2 rows in set (0.00 sec) #创建复制账号 mysql> create user 'jiaoxw' @ '10.0.0.%' identified create user 'jxw' @ '10.0.0.%' identified with mysql_native_password by 'magedu' ; mysql> grant replication slave on *.* to 'jiaoxw' @ '10.0.0.%' ; #从节点配置 [root@localhost ~]#vim /etc/my.cnf [mysqld] log-bin server-id=# #使用有复制权限的用户账号连接至主服务器,并启动复制线程 mysql> change master to master_host= '10.0.0.7' , -> master_user= 'jiaoxw' , -> master_password= 'magedu' , -> master_port=3306, -> master_log_file= 'centos7-bin.000006' , -> master_log_pos=157; mysql> change master to master_host= '10.0.0.7' ,master_user= 'jiaoxw' ,master_password= 'magedu' ,master_port=3306,master_log_file= 'centos7-bin.000006' ,master_log_pos=157; mysql> start slave; |
主主复制实现步骤:
#在第一个master节点上实现 [root@localhost ~]#vim /etc/my.cnf [mysqld] log-bin server-id=7 auto_increment_offset=1 #开始点 auto_increment_increment=2 #增长幅度 [root@localhost ~]#systemctl restart mysqld #创建复制账号 mysql> create user 'jiaoxw' @ '10.0.0.%' identified create user 'joaoxw' @ '10.0.0.%' identified with mysql_native_password by 'magedu' ; mysql> grant replication slave on *.* to 'jiaoxw' @ '10.0.0.%' ; #在第二个master节点上实现 [root@localhost ~]#vim /etc/my.cnf [mysqld] log-bin server-id=8 auto_increment_offset=2 #开始点 auto_increment_increment=2 #增长幅度 [root@localhost ~]#systemctl restart mysqld mysql> CHANGE MASTER TO MASTER_HOST= '10.0.0.7' , -> MASTER_USER= 'jiaoxw' , -> MASTER_PASSWORD= 'magedu' , -> MASTER_PORT=3306, -> MASTER_LOG_FILE= 'centos7-bin.000006' , -> MASTER_LOG_POS=157; mysql> start slave; mysql> show master logs; #查看二进制位置 #在第一个master节点上实现 mysql> CHANGE MASTER TO MASTER_HOST= '10.0.0.8' , -> MASTER_USER= 'jiaoxw' , -> MASTER_PASSWORD= 'magedu' , -> MASTER_PORT=3306, -> MASTER_LOG_FILE= 'centos8-bin.000006' , -> MASTER_LOG_POS=386; mysql> start slave; |
2、xtrabackup实现全量+增量+binlog恢复库
下载并安装xtarbackup
wget https: //downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.23/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.23-1.el7.x86_64.rpm yum -y install percona-xtrabackup-24-2.4.23-1.el7.x86_64.rpm |
在主机做完全备份到/backup目录
xtrabackup -uroot -p123456 --backup --target-dir=/backup/ |
在目标主机上还原mysql
把备份文件scp到目标主机 scp -r /backup root@10.0.0.8:/root 在目标主机上还原 xtrabackup --prepare --target-dir=/backup xtrabackup --copy-back --target-dir=/backu chown -R mysql:mysql /data/mysql systemctl start mysqld |
增量备份及还原
新增数据 mysql> create database testdb1; Query OK, 1 row affected (0.01 sec) mysql> create database testdb2; Query OK, 1 row affected (0.00 sec) 第一次增量 xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/ 新增数据 mysql> create database testdb3; Query OK, 1 row affected (0.01 sec) mysql> create database testdb4; Query OK, 1 row affected (0.00 sec) |
拷贝至目标主机
scp -r /backup root@10.0.0.8:/backup1 |
备份主机开始还原
预准备完成备份,此选项--apply-log-only 阻止回滚未完成的事务 xtrabackup --prepare --apply-log-only --target-dir=/backup12 xtrabackup --prepare --apply-log-only --target-dir=/backup1 --incremental-dir=/backup1/inc1 合并第2次增量备份到完全备份:最后一次还原不需要加选项--apply-log-only xtrabackup --prepare --target-dir=/backup1 --incrementaldir=/backup1/inc2 复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动 xtrabackup --copy-back --target-dir=/backup1 还原属性 chown -R mysql.mysql /data/mysql 启动服务 systemctl start mysqld |
3、MyCAT实现MySQL读写分离
准备环境:
systemctl stop firewalld setenforce 0 时间同步 #准备4台服务器 10.0.0.7 为客服端 10.0.0.8 为mycat服务器 10.0.0.17 为mysql主服务器 10.0.0.18 为mysql从服务器 |
创建mysql主从数据库
#主节点配置 #server-id唯一不可重复 [root@localhost ~]#vim /etc/my.cnf [mysqld] log-bin server-id=# #查看binlog文件位置 mysql> show master logs; +--------------------+-----------+-----------+ | Log_name | File_size | Encrypted | +--------------------+-----------+-----------+ | centos7-bin.000005 | 180 | No | | centos7-bin.000006 | 157 | No | +--------------------+-----------+-----------+ 2 rows in set (0.00 sec) #创建复制账号 mysql> create user 'jiaoxw' @ '10.0.0.%' identified create user 'jxw' @ '10.0.0.%' identified with mysql_native_password by 'magedu' ; mysql> grant replication slave on *.* to 'jiaoxw' @ '10.0.0.%' ; #从节点配置 [root@localhost ~]#vim /etc/my.cnf [mysqld] log-bin server-id=# #使用有复制权限的用户账号连接至主服务器,并启动复制线程 mysql> change master to master_host= '10.0.0.7' , -> master_user= 'jiaoxw' , -> master_password= 'magedu' , -> master_port=3306, -> master_log_file= 'centos7-bin.000006' , -> master_log_pos=157; mysql> change master to master_host= '10.0.0.7' ,master_user= 'jiaoxw' ,master_password= 'magedu' ,master_port=3306,master_log_file= 'centos7-bin.000006' ,master_log_pos=157; mysql> start slave |
安装并启动mycat
[root@localhost ~]#yum -y install java [root@localhost ~]#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 [root@localhost ~]#mkdir /apps [root@localhost ~]#tar -xvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps #配置环境变量 [root@localhost ~]#echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh [root@localhost ~]#source /etc/profile.d/mycat.sh #启动 [root@localhost ~]#mycat start #查看日志,确认成功 [root@localhost ~]#cat /apps/mycat/logs/wrapps.log ...省略... INFO | jvm 1 | 2022/06/04 13:48:11 | MyCAT Server startup successfully. see logs in logs/mycat.log #连接mycat,默认密码为123456,默认端口为8066 [root@localhost ~]#mysql -uroot -p123456 -h127.0.0.1 -P8066 |
在mycat服务器上修改server.xml文件配置mycat连接信息
[root@localhost ~]#vim /apps/mycat/conf/server.xml #删除注释,并修改下面行的8066改为3306 <property name= "serverPort" >3306</property> <property name= "managerPort" >9066</property> <property name= "idleTimeout" >300000</property> <property name= "authTimeout" >15000</property> <property name= "bindIp" >0.0.0.0</property> <property name= "dataNodeIdleCheckPeriod" >300000</property> #5 * 60 * 1000L; //连接空闲检查 删除#后面此部分 <property name= "frontWriteQueueSize" >4096</property> <property name= "processors" >32</property> #--> 删除#后面此部分 ..... <user name= "root" > #连接Mycat的用户名 <property name= "password" >magedu</property> #连接Mycat的密码 <property name= "schemas" >TESTDB</property> #数据库名要和schema.xml相对应 |
修改schema.xml实现读写分离策略
#修改后的读写分离策略 [root@localhost ~]#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.0.17:3306" user= "root" password= "123456" > <readHost host= "host2" url= "10.0.0.18:3306" user= "root" password= "123456" /> </writeHost> </dataHost> </mycat:schema> |
在后端服务器创建用户并对mycat授权
[root@localhost ~]#mysql -uroot -p mysql> create user 'root' @ '10.0.0.%' identified with mysql_native_password by '123456' ; mysql> grant all on *.* to 'root' @ '10.0.0.%' ; mysql> flush privileges; |
在mycat服务器上连接测试
[root@localhost ~]#mysql -uroot -pmagedu -h127.0.0.1 mysql> show databases; +----------+ | DATABASE | +----------+ | TESTDB | +----------+ 1 row in set (0.00 sec) mysql> use TESTDB; mysql> show tables; +-------------------+ | Tables_in_hellodb | +-------------------+ | classes | | coc | | courses | | scores | | students | | teachers | | toc | +-------------------+ 7 rows in set (0.00 sec) mysql> select @@server_id; +-------------+ | @@server_id | +-------------+ | 18 | +-------------+ 1 row in set (0.00 sec) mysql> select @@hostname; +-------------+ | @@hostname | +-------------+ | centos8.org | +-------------+ 1 row in set (0.00 sec) |
4、ansible常用模块介绍
ping模块:检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong
raw模块:执行原始的命令,而不是通过模块子系统。在任何情况下,使用shell或命令模块是合适的。给定原始的参数直接通过配置的远程shell运行。可返回标准输出、错误输出和返回代码。此模块没有变更处理程序支持
yum模块:这个模块是RedHat / CentOS作为远端节点的OS的时候,用的最多的。RedHat / CentOS包管理工具
使用`yum’软件包管理器管理软件包,其选项有:
– config_file:yum的配置文件 (optional)
– disable_gpg_check:关闭gpg_check (optional)
– disablerepo:不启用某个源 (optional)
– enablerepo:启用某个源(optional)
– name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径
– state:状态(present,absent,latest),表示是安装还卸载
present:默认的,表示为安装
lastest: 安装为最新的版本
absent:表示删除
apt模块:这个模块是ubuntu作为远端节点的OS的时候,用的最多的。Ubuntu/Debian的包管理工具
– deb: 用于安装远程机器上的.deb后缀的软件包(optional)
– install_recommends:这个参数可以控制远程电脑上是否只是下载软件包,还是下载后安装,默认参数为true,设置为false的时候只下载软件包,不安装
– update_cache: 当这个参数为yes的时候等于apt-get update(optional)
– name: apt要下载的软件包名字,支持name=git=1.6 这种制定版本的模式
– state:状态(present,absent,latest),表示是安装还卸载
present:默认的,表示为安装
lastest: 安装为最新的版本
absent:表示删除
pip模块:用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements
– chdir: 执行pip命令前cd进入的目录
– name:要安装的Python库的名称或远程包的URL。
– requirements:一个pip requirements.txt文件的路径,它应该是远程系统的本地文件,如果使用chdir选项,则可以将文件指定为相对路径。
– version:指定的Python库的安装版本。
– extra_args:额外的参数传递给pip。
– executable:显式可执行文件或可执行文件的路径名,用于为系统中安装的特定版本的Python运行pip。 例如pip-3.3,如果系统中安装了Python 2.7和3.3,并且想要为Python 3.3安装运行pip。 它不能与“virtualenv”参数一起指定(在2.1中添加)。 默认情况下,它将采用适用于python解释器的版本。 pip3在python 3上,pip2或pip在python 2上。
– virtualenv:要安装到的virtualenv目录的可选路径。 它不能与’executable’参数一起指定(在2.1中添加)。 如果virtualenv不存在,则将在安装软件包之前创建它。 可选的virtualenv_site_packages,virtualenv_command和virtualenv_python选项会影响virtualenv的创建。
– virtualenv_command:用于创建虚拟环境的命令或路径名。 例如pyvenv,virtualenv,virtualenv2,~/bin /virtualenv,/usr/local/bin/virtualenv。
– virtualenv_python:用于创建虚拟环境的Python可执行文件。 例如python3.5,python2.7。 未指定时,将使用用于运行ansible模块的Python版本。 当virtualenv_command使用pyvenv或-m venv模块时,不应使用此参数。
– state:状态(present,absent,latest, forcereinstall),表示是安装还卸载
present:默认的,表示为安装
lastest: 安装为最新的版本
absent:表示删除
forcereinstall:“forcereinstall”选项仅适用于可ansible 2.1及更高版本。
synchronize模块:– 使用rsync同步文件,将主控方目录推送到指定节点的目录下,其参数如下:
– delete: 删除不存在的文件,delete=yes 使两边的内容一样(即以推送方为主),默认no
– src: 要同步到目的地的源主机上的路径; 路径可以是绝对的或相对的。如果路径使用"/“来结尾,则只复制目录里的内容,如果没有使用”/"来结尾,则包含目录在内的整个内容全部复制
– dest:目的地主机上将与源同步的路径; 路径可以是绝对的或相对的。
– dest_port:默认目录主机上的端口 ,默认是22,走的ssh协议。
– mode: push或pull,默认push,一般用于从本机向远程主机上传文件,pull 模式用于从远程主机上取文件。
– rsync_opts:通过传递数组来指定其他rsync选项。
template模块:基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。它的每次使用都会被ansible标记为”changed”状态。)
– backup: 如果原目标文件存在,则先备份目标文件
– src:在ansible控制器上的Jinja2格式化模板的路径。 这可以是相对或绝对的路径。
– dest:将模板渲染到远程机器上的位置。
force:是否强制覆盖,默认为yes
– owner:目标文件属主
– group:目标文件属组
– mode:目标文件的权限模式,模式可以被指定为符号模式(例如,u + rwx或u = rw,g = r,o = r)。
copy模块:在远程主机执行复制操作文件。
– src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/“来结尾,则只复制目录里的内容,如果没有使用”/“来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
– content:用于替代"src”,可以直接设定指定文件的值
– dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
– directory_mode:递归的设定目录的权限,默认为系统默认权限
– force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
– others:所有的file模块里的选项都可以在这里使用
user模块:user模块是请求的是useradd, userdel, usermod三个指令
– home:指定用户的家目录,需要与createhome配合使用。
– groups:指定用户的属组。
– uid:指定用的uid。
– password:指定用户的密码。
注意:指定password参数时,不能使用明文密码,因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。
– name:指定用户名。
– createhome:是否创建家目录 yes|no。
– system:是否为系统用户。
– remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r。
– state:是创建还是删除。(present,absent)
– shell:指定用户的shell环境。
– generate_ssh_key:是否为相关用户生成SSH密钥。 这不会覆盖现有的SSH密钥。
– ssh_key_bits:可选择指定要创建的SSH密钥中的位数。
– ssh_key_passphrase:设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。
– ssh_key_file:指定SSH密钥文件名(可选)。 如果这是一个相对的文件名,那么它将是相对于用户的主目录。
– ssh_key_type:指定要生成的SSH密钥的类型(可选)。 可用的SSH密钥类型将取决于目标主机上的实现。
group模块:goup模块请求的是groupadd, groupdel, groupmod 三个指令
– gid:指定用的gid。
– name:指定用户名。
– state:是创建还是删除。(present,absent)
– system:如果是,则表示创建的组是系统组。
service模块:用于管理服务。
– arguments:给命令行提供一些选项
– enabled:是否开机启动 yes|no, 要求状态(state)和启用(enabled)中至少有一个。
– name:必选项,服务名称
– runlevel:运行级别
– sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
– state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~