主从复制
主:
create database HA;
vim /etc/my.cnf
添加
log-bin=mysql-bin-master
server-id=1
binlog-do-db=HA
binlog-ignore-db=mysql
重启数据库
systemctl restart mysql
创建同步用户给用户授权
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
flush privileges;
show master status;
导出数据库文件
mysqldump -uroot -p1 HA >HA.sql
将数据库文件传输给从机
scp HA.sql root@10.0.0.15:/root
从:
vim /etc/my.cnf
log-bin=mysql-bin-master
server-id=2
binlog-do-db=HA
binlog-ignore-db=mysql
vim /usr/local/mysql/data/auto.cnf
重启mysql
systemctl restart mysql
mysql -uroot -p1
stop slave
change master to master_host='10.0.0.3',master_user='slave',master_password='1',master_port=3306,master_,master_log_file='binlog.000010',master_log_pos=807;
start slave;
show salve status\G
读写分离
1.前提做好主从复制
2.在主机上安装mycat
3.上传mycat安装包和jdk安装包
4.安装jdk
1、传到安装包/usr/local下
2、解压缩tar xf jdk....
3、重命名 mv jdk... jdk8
4、配置环境变量
vim /etc/profile
JAVA_HOME=/usr/local/jdk8
PATH=$PATH:$JAVA_HOME/bin
export PATH
5、生效
soure /etc/profile
6、检查
java -version
5.安装mycat
1、传到/usr/local
2、解压缩 tar xvf
6.修改配置文件
server.xml
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">同步数据库名称</property>
<property name="defaultScheddma">同步数据库名称</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">同步数据库名称</property>
<property name="readOnly">true</property>
<property name="defaultSchema">同步数据库名称</property>
</user>
schema.xml
替换整个文件
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="数据库名" checkSQLschema="true" sqlMaxLimit="100" dataNode='dn1'>
</schema>
<dataNode name="dn1" dataHost="host1" database="数据库名" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="主机IP:3306" user="root"
password="123456">
<readHost host="hostS1" url="从机IP:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
log4j2.xml
<asyncRoot level="debug" includeLocation="true">
<AppenderRef ref="Console"/>
7.如果是mysql8,修改ajr包
1、把mysql8驱动jar包放到mysql/lib下
2、把原来mysql-connector-5.1.35.jar改为mysql-connentor-5.1.35.jar.bak
3、给mysql8的jar执行权限
chmod +x mysql-connection-8.1.12.jar
8.配置mycat的环境变量
vim /etc/profile
添加
MYCAT_HOME=/usr/local/mycat
生效
source /etc/profile
9.在主从mysql中创建用户授权
create user 'root'@'%' identified with mysql_native_password by '1';
grant all on *.* to 'root'@'%';
flush privileges;
10.启动mycat
在mycat/bin
./mycat start\stop\restart\console
11.修改mycat所在主机的my.cnf
[mysqld]
sql_mode=""
default_authentication_plugin=mysql_native_password
重启mysql
12.测试
登录mycat
mysql -uroot -p1 -P8066 -h10.0.0.4 --default_auth=mysql_native_password
进入数据库执行增删改查
看mycat控制台查看sql路由
MHA
1.准备四台,其中三台是mysql服务器,一主二从,一台管理器
2.实现四台服务器的免密登录
ssh-keygen -t rsa 生成密钥
ssh-copy-id 服务器id 发送公钥到其他三台机器
3.所有机器安装依赖
yum -y install epel-release
yum -y install perl-DBD-MySQL perl-Config-Tiny
perl-Log-Dispatch perl-Parallel-Forkmanager --skip-broken
4.所有机器都安装mha-node
上传mha-node-xx.rpm文件
执行安装命令
rpm -ivh mha-node-xxx.rpm
5.登录三台mysql,创建复制用户
mysql -uroot -p1
create user 'slave'@'%' identified with mysql_native_password by '1';
grant replication slave on *.* to 'slave'@'%';
flush privileges;
6.两个从机需要设置只读、清理relay_log
mysql -uroot -p1 -e 'set global read_only =1'
mysql -uroot -p1 -e 'set global read_only=0'
7.要保证所有mysql服务器上
server-id 不相同
binlog-do-db
binlog-ignore-db 这两必须相同
8.在管理器服务器安装manager
安装依赖
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl- Time-HiRes perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN -y
安装manager
rpm -ivh mha4mysql-manager-0.57-0.el7.noarch.rpm
9.在管理器上创建目录
mkdir -p /etc/masterha
mkdir -p /var/log/masterha/app1
10.创建配置文件
vim /etc/masterha/app1.cnf
# 修改app1.cnf配置文件,修改后的文件内容如下(注意,配置文件中的注释需要去掉)
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
master_binlog_dir=/use/local/mysql/data
master_ip_failover_script= /usr/local/bin/master_ip_failover #自动切换脚本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change
password=123456 #设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
user=root #设置监控用户root
ping_interval=1
remote_workdir=/tmp #设置远端mysql在发生切换时binlog的保存位置
repl_password=123456 #设置复制用户的密码
repl_user=slave #设置复制环境中的复制用户名
report_script=/usr/local/send_report #设置发生切换后发送的报警的脚本
shutdown_script="" #设置故障发生后关闭故障主机脚本
ssh_user=root #设置ssh的登录用户名
[server1]
hostname=主机IP
port=3306
[server2]
hostname=从机(主机备胎)
port=3306
candidate_master=1
check_repl_delay=0
[server3]
hostname=从机
port=3306
11.创建自动切换脚本
vim /usr/local/bin/master_ip_failover
修改网段 $vip = '10.0.0.0/24';
修改网卡名 ens33
加执行权限
chmod +x /usr/local/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
use MHA::DBHelper;
my (
$command, $ssh_user, $orig_master_host,
$orig_master_ip, $orig_master_port, $new_master_host,
$new_master_ip, $new_master_port, $new_master_user,
$new_master_password
);
my $vip = '192.168.101.100/24';
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
'new_master_user=s' => \$new_master_user,
'new_master_password=s' => \$new_master_password,
);
exit &main();
sub main {
if ( $command eq "stop" || $command eq "stopssh" ) {
# $orig_master_host, $orig_master_ip, $orig_master_port are passed.
# If you manage master ip address at global catalog database,
# invalidate orig_master_ip here.
my $exit_code = 1;
eval {
# updating global catalog, etc
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
# all arguments are passed.
# If you manage master ip address at global catalog database,
# activate new_master_ip here.
# You can also grant write access (create user, set read_only=0, etc) here.
my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
`ssh $ssh_user\@$orig_master_host \" $ssh_start_vip \"`;
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
grep
基本语法:grep '查找内容' 文件路径
-m n 表示匹配前n次后停止匹配
-B n 表示过滤的信息和过滤信息前n行信息一起过滤输出
-A n 表示过滤的信息和过滤信息后n行信息一起过滤输出
-C n 表示过滤的信息和过滤信息前后n行信息一起过滤输出
-i 表示忽略过滤信息的大小写
-o 表示只显示匹配到内容
-n 表示过滤信息显示输出行号
-c 小写字母c表示统计过滤信息的次数
-v 表示对过滤信息进行取反显示
-e 表示多个条件过滤文件
-E 等价于egrep命令,识别扩展正则表达式
-q 静默模式,不输出任何信息(可以通过echo ?判断是否匹配到)
-w 匹配整个单词,相当于\<xxxxx\>
-F 不支持正则表达式,相当于fgrep
-f file 把过滤条件写入文件中,文件中不需要写引号
-r 递归目录,但不处理软链接文件
-R 递归目录,但处理软链接文件
正则表达式 元字符
. 匹配任意单个字符
\w 任意 字母数字或下划线
[] 匹配指定范围内的任意单个字符
[a-zA-Z] 匹配大小写字母
[^] 取反
[0-9] 匹配0到9之间的数字
[a-z] 匹配a-z小写字母
[A-Z] 匹配A-Z小写字母
[abc] 匹配列表中的任何一个字符
[^demo] 匹配列表中的所有字符以外的字符
[[:digit:]] 匹配任意数字
[[:lower:]] 匹配任意小写字母
[[:upper:]] 匹配任意大写字母
[[:alpha:]] 匹配任意大小写字母
[[:alnum:]] 匹配任意数字或字母
[[:blank:]] 匹配水平空白字符
[[:space:]] 匹配水平或垂直空白字符
[[:punct:]] 匹配标点符号
[[:print:]] 匹配可打印字符
[[:cntrl:]] 匹配控制(非打印)字符
[[:graph:]] 匹配图形字符
[[:xdigit:]] 匹配十六进制字符
次数匹配
* 匹配前面的字符任意次
.* 任意长度的任意字符
\? 匹配其前面的字符出现0次或1次
\+ 匹配匹配其前面的字符出现至少1次
\{n\} 匹配前面的字符n次
\{m,n} 匹配前面的字符至少m次,至少n次
\{,n} 匹配前面的字符至多n次
\{n,} 匹配前面的字符至少n次
sed
-n:关闭sed默认输出功能,只输出script处理过的信息
-e:指定多个script指令,多点匹配
-f:从指定文件读取script指令
-r:识别扩展正则表达式
-i:sed默认处理数据不影响文件原内容
指令
p:输出script处理的数据行
ip:|参数忽略过滤信息大小写
d:删除模式匹配的行
a\:模式匹配的行后面追加内容信息,并处理下一行
i\:模式匹配的行前面追加内容信息,并处理下一行
c\:替换指定整行信息
w file:保存模式匹配的行至指定文件
r file:读取指定文件的文本至模式空间中匹配到的行后
=显示匹配到信息所在行号
!取反
;同参数-e