数据库备份实验:
方式一:复制数据文件
$ cp -a /usr/local/mysql/data 备份目录
$ cp -a /var/lib/mysql 备份目录
方式二:二进制日志备份(log-bin):
yum -y install mariadb-server mariadb #安装数据库
systemctl start mariadb #启动数据库
vim /etc/my.cnf #修改配置文件,产生二进制文件
log-bin=mariadb-bin #新增一行开启二进制日志产生的文件
systemctl restart mariadb
mysqlbinlog mariadb-bin.000001 #查看二进制文件
mysqlbinlog --start-datetime '2023-10-25 15:02:00' --stop-datetime '2023-10-25 15:09:10' mariadb-bin.000001 | mysql -uroot -p123456
#将二进制文件导入数据库,数据库按时间范围根据日志文件里的命令恢复数据库。
mysqlbinlog --start-position 106 --stop-position 185 mysql-bin.000001 | mysql -uroot -p
#根据数据大小进行恢复
方式三:mysqldump命令备份、mysql还原
#备份一个数据库
$ mysqldump -u用户名 -p密码 要备份的数据库名 > 文件名.sql
#备份一个数据库中的某张表
$ mysqldump -u用户名 -p密码 要备份的数据库名 表名 > 文件名.sql
#备份多个数据库
$ mysqldump -u用户名 -p密码 --databases 数据库名1 数据库名2 > 文件名.sql
#备份所有数据库
$ mysqldump -u用户名 -p密码 --all-databases > 文件名.sql
#还原,注意恢复备份的是一个数据库的时候需要手动创建数据库、再指定还原
$ mysql -u用户名 -p密码 要还原到的数据库名 < 文件名.sql
#还原多个数据库
$ mysql -u用户名 -p密码 < 文件名.sq
一、数据库主从实验:
主服务器执行修改数据的命令,会把命令过程记录到bin-log日志文件,同时通知从服务器,从服务器使用已经接收了的主服务器授权记录登录主服务器,根据自己的日志在bin-log日志里按照上次的同步节点增量同步到本地中继日志中,这个过程使用的是i/o线程,下一个SQL线程执行新增的SQL语句,进行同步。
从服务器可以随时替换主服务器,从服务器可以分摊压力,可以充当数据备份
1、主从服务器都安装mariadb数据库
- yum -y install mariadb-server mariadb
2、打开主服务器的二进制日志文件
- vim /etc/my.cnf
log-bin=mariadb-bin
server-id=77 #修改ID号
systemctl start mariadb
3、打开从服务器的配置文件,修改ID
- vim /etc/my.cnf
server-id=177
systemctl start mariadb
4、主服务器创建一个远程登录的授权账号,授予从服务身份
- grant replication slave on *.* to slave@'192.168.89.177' identified by '123456';
5、从服务器接受授权
登录mysql数据库接受授权
- change master to master_user=‘slave’,master_host='192.168.89.77',master_port=3306,master_password='123456',master_log_file='mariadb-bin.000003',master_log_pos=399;
# master_log_file:二进制日志文件名
# master_log_pos:二进制日志文件大小
- 退出数据库cd /var/lib/mysql/查看是否出现master.info文件
#master.infof文件负责保存从服务器连接主服务器时使用的参数。
再登录数据库里让主从数据库建立连接
- start slave; #启动从进程
- show slave status\G; #查看主从服务器是否同步成功
查看两个YES是否为yes,同步过来的文件为中继日志文件(relay_log_file)
- 主数据库执行创建,修改,删除,插入等命令,回到从数据库查看变化,是否同步
二、主主实验(互为主从):
1、在主从实验的基础上继续以下操作的话要先关闭同步。
2、以1为主,2为从配置一遍主从,在主配置文件中配置一下(开启二进制日志和其他内容)
3、在2上的配置文件做相同的配置,IP不同。
4、启动mariadb服务器,
5、1为主2为从:在主服务器(1)上授权
grant replication slave on *.* to slave@'192.168.88.130' identified by '123456'
在从服务器(2)上保存授权信息
change master to master_host='192.168.88.120',master_user='slave',master_port=3306,master_password='123456',master_log_file='mariadb-bin.000001',master_log_pos=399;
6、2为主1为从:
在主服务器(2)上授权
在从服务器(1)上保存授权信息
7、1和2都执行start slave(互为主从)
start slave; #开启同步
show slave status\G; #查看同步是否开启
互相同步后分别有两套中继日志和log-bin日志
8、测试
create table hongfu(id int,name char(10),age int(3));
insert into hongfu values(1,'zhangsan',18);
三、多主多从实验:
1、每台服务器都安装mariadb数据库,并修改配置文件,修改ID,两个主服务器开启log-bin 二进制日志文件。
yum -y install mariadb-server
vim /etc/my.cnf
log-bin=mariadb-bin
server-id=12\13\14
启动两个主服务器,systemctl start mariadb
2、主服务器1配置
- 开启二进制日志,启动服务
- systemctl start mariadb
- 给主服务器2授权
grant replication slave on *.* to slave@'主服务器2IP' identified by '123456'
- 在主服务器(2)上保存授权信息
change master to master_host='192.168.88.120',master_user='slave',master_port='3306',master_password='123456',master_log_file='mariadb-bin.000001',master_log_pos='399';
3、在主服务器2上做相同的操作外,再加入一行log-slave-updates开启让中继日志同步到自己的bin-log日志的开关,使得主1执行的命名也能同步到主2的从服务器上。
- systemctl restart mariadb
- 给主服务器1授权
grant replication slave on *.* to slave@'主服务器1IP' identified by '123456'
- 给从服务器授权
grant replication slave on *.* to slave@'从服务器1IP' identified by '123456'
- 在主服务器(1)上保存授权信息
change master to master_host='192.168.88.130',master_user='slave',master_port='3306',master_password='123456',master_log_file='mariadb-bin.000001',master_log_pos='399';
查看二进制日志文件名和大小:show master status;
- 在从服务器上保存授权信息
change master to master_host='192.168.88.130',master_user='slave',master_port=3306,master_password='123456',master_log_file='mariadb-bin.000001',master_log_pos=399;
- 同时在三台服务器上开启同步:start slave;
- 查看同步开启状态:show slave status\G;
4、在主1上创建库,表,查看主2的从服务器是否同步。
四、多主一从实验;
主服务器配置
开启二进制日志,启动服务
授权
在主服务器2上做相同的操作
授权
从服务器操作
对主配置文件操作
#多主一从配置,请勿删除
[mysqld_multi]
mysqld=/usr/bin/mysqld_safe
mysqladmin=/usr/bin/mysqladmin
log=/tmp/multi.log
[mysqld11]
port=3307
datadir=/var/lib/mysqla/
pid-file=/var/lib/mysqla/mysqld.pid
socket=/var/lib/mysqla/mysql/sock
user=mysql
server-id=13
[mysqld12]
port=3308
datadir=/var/lib/mysqlb/
pid-file=/var/lib/mysqlb/mysqld.pid
socket=/var/lib/mysqlb/mysql/sock
user=mysql
server-id=13
初始化数据库,生成目录mysqla,mysqlb
mysql_install_db --datadir=/var/lib/mysqla --user=mysql
mysql_install_db --datadir=/var/lib/mysqlb --user=mysql
设置mysqla,mysqlb目录及以下文件的属主为mysql(防止出现权限问题)
启动从服务器上的两个独立进程
mysqld_multi --defaults-file=/etc/my.cnf start 11
mysqld_multi --defaults-file=/etc/my.cnf start 12
登录并保存授权信息
测试
五、读写分离试验:
主从从 + 读写分离
规划:
7-1 测试机 - mysql客户端
7-2 中间件 - amoeba
7-3 mariadb - master
7-4 mariadb - slave 1
7-5 mariadb - slave 2
账号,授权 规划:
三台数据库 - 主从从 #授权关系和账号
主 授予 两个从服务器 replication slave 权限
主的授权账号:
slave@'192.168.88.140' #给从服务器140使用的
slave@'192.168.88.150' #给从服务器150使用的
账号:slave
三台数据库 给 amoeba服务器授权的账号和权限
grant all on hongfu.* to amoeba_user@'192.168.88.120' identified by '123456';
账号:amoeba_user
#授权时,可以独立授权,也可以使用主服务器授权,并同步给从服务器。
amoeba 服务器的 账号,密码,端口等信息
账号:amoeba_root
端口:8066(默认) -> 3306
读写分离
中间件:一种提供在不同技术、不同的软件之间共享资源的程序,更大化了利用了数据库的性能,可以无限扩展(注:真实环境中并非如此)
数据库的中间件:
mysql proxy (官方版本) 性能低,需要lua脚本
atlas 性能低,响应时间长
amoeba 陈思儒研发的
一.先搭建一个主从关系的服务器
1、在主、从、从服务器上安装mysql mysql-server
2、主服务器开启二进制日志log-bin=mariadb-bin,所有mysql服务器都修改ID号
server-id=服务器IP。
3、在主服务器上授权,从服务器上保存授权信息,并开启从服务线程。
主: grant replication slave on *.* to slave@'192.168.88.140' identified by '123456';
grant replication slave on *.* to slave@'192.168.88.150' identified by '123456';
show master status;
从: change master to master_host='主服务器IP',master_port=3306,master_user='slave',master_password='123456',master_log_file='mariadb-bin.000001',master_log_pos=553;
start slave;
show slave status\G;
4、主服务器给amoeba服务器授权,从服务器也会同步授权。
grant all on hongfu.* to amoeba_user@'192.168.88.120' identified by '123456';
5、关闭从服务器线程,主服务器再修改或者创建,为了做读写分离时,服务器数据不一样,测试有明显的实验效果(实际生产环境中不能停掉。。)(先关闭从1,增加主服务器数据,再关从2,主服务器再增加数据。)
二、配置读写分离
1、安装gcc环境(amoeba需要源码安装)
2、拷贝第三方软件,创建单独的目录
unzip amoeba-n.zip
cd amoeba-n
tar -xf jkd-7
cp -r jdk1.7.0_40 /usr/local/jdk
mkdir /usr/local/amoeba
unzip amoeba-mysql -d /usr/local/amoeba/
3、声明用java写出来的程序如何调用(/etc/profile),写入环境变量。
长度
4、安装amoeba
将/usr/local/amoeba/conf/amoeba.xml导入到Windows,使用nodpid的工具查看,修改文件类型为unix,"gdk"修改为utf-8,然后再工具栏点击编码,转为UTF-8编码,ctrl+s保存文件,再导回Linux,就不会乱码了。
5、配置amoeba这个软件
<server>.....</server>区域
前面的两个大标签都是关于amoeba如何运行的配置。
<dbServerList>......</dbServerList>区域(数据库列表)
有几台需要连接的数据库,就写几个server标签。
由于只提供了一个服务器模板,需要自己复制另外两个填写关于读的信息
复制两份模版,修改
修改虚拟服务器组的配置
loadblance后面>1<代表轮询,>2<代表权重;
poolnames后面标识那些服务器为一个组,server2,server3代表服务器2,3为一个组
WPool为写的虚拟服务器组,RPool为读的虚拟服务器组。
语句路由标签:
前三个标签都是辅助amoeba解析SQL语句的相关规则,让amoeba理解用户的调度是读还是写,defaultpool必须指主服务器,指主服务器的组或者主服务器名server1或WPool,writePool指向写的组,readPool指向读的组。
cd /usr/local/amoeba/bin
chmod +x *
ln -s /usr/local/amoeba/bin/* /usr/local/bin/
启动amoeba,修改一下启动脚本:/usr/local/amoeba/bin/amoeba
注意:将-Xss128k 修改为 -Xss256m
7、#在主和从服务器上进行指定用户授权,授权目的为了让amoeba能连接到主从服务器进行查询。
在用amoeba连接主从数据库前,先用amoeba的服务器安装mariadb远程连接,是否能连接上,阶段测试。
mkdir /usr/local/amoeba/logs
cd /usr/local/amoeba/logs
nohup bash -x /usr/local/amoeba/bin/amoeba &
把这个放到后台 退出终端也可以继续运行
注:如果报错,查看logs中的nohup.out文件,查看error等报错关键词。
ps aux | grep amoeba
查看一下运行的程序 查看到的话就说明程序已经运行了起来
8、客户端测试(安装一个MySQL软件包才可以连接)
客户端连接amoeba服务器
mysql -h192.168.88.120 -P8066 -uamoeba_root -p123456
登录后写入的数据是在主服务器上写入,读的是两个从服务器上的数据,且是轮询读取。
关闭amoeba用kill命令结束进程。
在主、从服务器上创建表a1,在主服务器的表中插入数据
之后在客户端登录测试::::
读取池的效果:
8、客户端安装apache服务
yum -y install gcc lrzsz httpd openssl-devel libcurl-devel perl-DBI pcre-devel libxml2 libxml2-devel mysql-devel php php-bcmath php-gd php-xml php-mbstring php-mysql php-pear php-xmlrpc net-tools
2、将Discz压缩包解压
unzip Discuz
cp -r upload/* /var/www/html
chown -R apache.apache /var/www/html/
登录两个从服务器开启同步,start slave;
kill amoeba进程号
vim /usr/local/amoeba/conf/amoeba.xml
8066改为3306
rm -rf nohup.out
! nohup
Windows浏览器安装项目
模拟主服务器故障,用从服务器进行替换主服务器。
1、关闭主服务器的mariadb,模拟故障
systemctl stop mariadb
2、关闭apache服务器
systemctl stop httpd
3、停止从服务器的同步
stop slave;
4、打开要替换主服务器的从服务器的log-bin日志
vim /etc/my.cnf
log-bin=mariadb-bin
systemctl restart mariadb
5、登录从服务器数据库,给其他从服务器授权。
grant replication slave on *.* to slave@'%' identified by '123456'
show master status;
6、从服务器接受授权
change master to master_host='主服务器IP',master_port=3306,master_user='slave',master_password='123456',master_log_file='mariadbin.000001',master_log_pos=553;
start slave;
show slave status\G;
7、登录amoeba服务器,修改配置文件,注释掉server1,虚拟读写组里面将server1改为server2,
vim /usr/local/amoeba/conf/amoeba.xml
8、重启amoeba服务
kill 进程号
rm -rf /usr/local/amoeba/logs/nohup.out
nohup bash -x /usr/local/amoeba/bin/amoeba &
9、启动apache服务
10、浏览器访问网页项目,进行测试。