0%

部署

# ccentos 7
yum install nginx

启动

systemctl start/stop/restart nginx

# 通过status查看nginx.conf配置文件位置
systemctl status nginx

修改配置

vim /etc/nginx/nginx.conf
# 修改默认端口80 -> 8080
listen       8080 default_server;
listen       [::]:8080 default_server;

# 检查配置是否正确,有successful表示可用
nginx -t 

# 重新加载配置文件
nginx -s reload

配置详解

...              // 全局块

events {         // events块
   ...
}

http      // http块
{
    ...   // http全局块
    server        // server块
    { 
        ...       // server全局块
        location [PATTERN]   // location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     // http全局块
}
  1. 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  2. events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  4. server块:配置虚拟主机的相关参数,一个http中可以有多个server
  5. location块:配置请求的路由,以及各种页面的处理情况。

nginx变量使用

# 变量申明
set $变量名 变量值

# 变量的引用
$变量名

预定义变量

常用变量

变量 作用
arg_参数名 URL中某个具体参数的值
query_string 与args变量完全相同
args 全部URL参数
is_args 如果请求的URL中有参数则返回?否则返回空
content_length HTTP 请求中标识包体长度的Content-Length头部的值,头部没有这个则为空
content_type 标识请求包体类型的Content-Type 头部的值
uri 请求的URI(不包含,不包含?后的参数)
document_uri 与uri完全相同
request_uri 请求的URL(包含?后的参数)
scheme 协议名 HTTP 或者 HTTPS
request_method 请求的方法GET 或者 POST
request_length 所有请求内容的大小,包括请求行,头部,包体等
remote_user 有HTTP Basic Authentication 协议传入的用户名
request 原始的url请求,含有方法和协议版本
cookie_COOKIE cookie COOKIE的值
http_HEADER HTTP请求头中的内容,HEADER为HTTP请求中的内容转为小写,-变为_(破折号变为下划线),例如:$http_user_agent(Uaer-Agent的值)
sent_http_HEADER HTTP响应头中的内容,HEADER为HTTP响应中的内容转为小写,-变为_(破折号变为下划线),例如: $sent_http_cache_control, $sent_http_content_type…;

TCP相关的变量

变量 作用
binary_remote_addr 客户端地质的整型格式,对于IPv4是4字节
remote_addr 客户端地址
remote_port 客户端端口
connection 递增的连接序号
connection_requests 当前连接上执行过的请求数,对keepalive 有意义
proxy_protocol_addr 若使用了proxy_protocol 协议则返回协议中的地址
proxy_protocol_port 若使用了proxy_protocol 协议则返回协议中的端口
server_addr 服务器端地址(本端地址)
server_port 服务器端端口
TCP_INFO tcp内核层参数($tcpinfo_rtt,$tcpinfo_rttvar,$tcpinfo_snd_cwnd,$tcpinfo_rcv_space)
server_protocol 服务端协议,例如 HTTP

Nginx处理请求过程中产生的变量

变量 作用
request_time 请求处理到现在的耗时
server_name 匹配上的请求server_name
request_completion 若请求处理完则返回OK,否则为空
request_id 以16禁止输出的请求标识id,随即生成

Nginx系统变量

变量 作用
time_local 以本地时间的标准输出
pid 所属worker进程的id
hostname 与系统上输出hostname 一致

PushGateway使用说明

  • Prometheus采用定时Pull模式,可能由于子网络或者防火墙的原因,不能直接拉取各个Target的指标数据,此时可以采用各个TargetPushGatewayPush数据,然后PrometheusPushGateway上定时pull
  • 其次在监控各个业务数据时,需要将各个不同的业务数据进行统一汇总,此时也可以采用PushGateway来统一收集,然后Prometheus来统一拉取
  • Prometheus每次从PushGateway拉取的数据,并不是拉取周期内用户推送上来的所有数据,而是最后一次PushPushGateway上的数据
  • 指标值只能是数字类型,非数字类型报错
  • 指标值支持最大长度为16位,超过16位后默认置为0

安装

# 默认不持久化数据
docker run -d -p 9091:9091 prom/PushGateway 

# 指定持久化文件和保留时间
docker run -d -p 9091:9091 prom/pushgateway "-persistence.file=pg_file –persistence.interval=5m"

测试

# 单条推送
echo "test_metric 123456" | curl --data-binary @- http://192.168.41.128:9091/metrics/job/test_job

# 多条推送
cat <<EOF | curl --data-binary @- http://192.168.41.128:9091/metrics/job/test_job/instance/test_instance
# TYPE test_metrics counter
test_metrics{label="app1",name="demo"} 100.00
# TYPE another_test_metrics gauge
# HELP another_test_metrics Just an example.
another_test_metrics 123.45
EOF

# 通过文件
vim pg.txt
# TYPE http_request_total counter
# HELP http_request_total get interface request count with different code.
http_request_total{code="200",interface="/v1/save"} 276
http_request_total{code="404",interface="/v1/delete"} 0
http_request_total{code="500",interface="/v1/save"} 1
# TYPE http_request_time gauge
# HELP http_request_time get core interface http request time.
http_request_time{code="200",interface="/v1/core"} 0.122

curl -XPOST --data-binary @pg.txt http://192.168.41.128:9091/metrics/job/app/instance/app-192.168.41.128

删除指标,参考官方

# {job="some_job",instance="some_instance"}
curl -X DELETE http://192.168.41.128:9091/metrics/job/some_job/instance/some_instance

# {job="some_job"}
curl -X DELETE http://192.168.41.128:9091/metrics/job/some_job

# 删除所有, 需要开启--web.enable-admin-api
curl -X PUT http://192.168.41.128:9091/api/v1/admin/wipe

通过SDK上传:

<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_pushgateway</artifactId>
    <version>0.7.0</version>
</dependency>
public static void main(String[] args) {
    try{
        String url = "192.168.41.128:9091";
        CollectorRegistry registry = new CollectorRegistry();
        Gauge guage = Gauge.build("my_custom_metric", "This is my custom metric.").create();
        guage.set(23.12);
        guage.register(registry);
        PushGateway pg = new PushGateway(url);
        Map<String, String> groupingKey = new HashMap<String, String>();
        groupingKey.put("instance", "my_instance");
        pg.pushAdd(registry, "my_job", groupingKey);
    } catch (Exception e){
        e.printStackTrace();
    }
}
public static void main(String[] args) {
    try{
        String url = "172.30.12.167:9091";
        CollectorRegistry registry = new CollectorRegistry();
        Gauge guage = Gauge.build("my_custom_metric", "This is my custom metric.").labelNames("app", "date").create();
        String date = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date());
        guage.labels("my-pushgateway-test-0", date).set(25);
        guage.labels("my-pushgateway-test-1", date).dec();
        guage.labels("my-pushgateway-test-2", date).dec(2);
        guage.labels("my-pushgateway-test-3", date).inc();
        guage.labels("my-pushgateway-test-4", date).inc(5);
        guage.register(registry);
        PushGateway pg = new PushGateway(url);
        Map<String, String> groupingKey = new HashMap<String, String>();
        groupingKey.put("instance", "my_instance");
        pg.pushAdd(registry, "my_job", groupingKey);
    } catch (Exception e){
        e.printStackTrace();
    }
}

查看

参考链接

mysql日志类型

redo log 重做日志 确保事务的持久性
undo log 回滚日志 用于回滚
bin log 二进制日志 主从复制
relay log 中继日志 主从复制
error log 错误日志
slow query log 慢查询日志
general log 一般查询日志

percona-toolkit介绍

percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括:

  1. 检查master和slave数据的一致性
  2. 有效地对记录进行归档
  3. 查找重复的索引
  4. 对服务器信息进行汇总
  5. 分析来自日志和tcpdump的查询
  6. 当系统出问题的时候收集重要的系统信息

percona-toolkit工具中最主要的三个组件分别是:

  1. pt-table-checksum 负责监测mysql主从数据一致性
  2. pt-table-sync 负责当主从数据不一致时修复数据,让它们保存数据的一致性
  3. pt-heartbeat 负责监控mysql主从同步延迟

percona-toolkit安装

  1. 安装依赖
# 安装依赖
yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI -y
  1. 下载安装包
  • 百度云盘下载地址:https://pan.baidu.com/s/1bp1OOgf (提取密码:y462)
  • wget https://www.percona.com/downloads/percona-toolkit/2.2.7/RPM/percona-toolkit-2.2.7-1.noarch.rpm
  1. 安装
rpm -ivh percona-toolkit-2.2.7-1.noarch.rpm

percona-toolkit使用

pt-table-checksumPercona-Toolkit的组件之一,用于检测MySQL主、从库的数据是否一致。其原理是在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库执行,并在从库上计算相同数据块的checksum,最后,比较主从库上相同数据块的checksum值,由此判断主从数据是否一致。

为了减少对数据库的干预,pt-table-checksum还会自动侦测并连接到从库,当然如果失败,可以指定–recursion-method选项来告诉从库在哪里。它的易用性还体现在,复制若有延迟,在从库 checksum 会暂停直到赶上主库的计算时间点。

为了保证主数据库服务的安全,该工具实现了许多保护措施:

  1. 自动设置 innodb_lock_wait_timeout1s,避免引起
  2. 默认当数据库有25个以上的并发查询时,pt-table-checksum会暂停。可以设置 --max-load 选项来设置这个阀值
  3. 当用Ctrl+C停止任务后,工具会正常的完成当前chunk检测,下次使用--resume选项启动可以恢复继续下一个chunk

创建授权帐号

-- 工具在主库上执行,IP写主库IP
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON *.* TO 'pt'@'192.168.41.141' identified by '123456';
mysql> flush privileges;

pt-table-checksum

在主(master)上通过执行校验的查询对复制的一致性进行检查,对比主从的校验值,从而产生结果。

注意:第一次运行的时候需要加上--create-replicate-table参数,生成checksums表!

常用参数解释:

--nocheck-replication-filters 不检查复制过滤器,建议启用。
--no-check-binlog-format 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only 只显示不同步的信息。
--replicate= 把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
--databases= 指定需要被检查的数据库,多个则用逗号隔开。
--tables= 指定需要被检查的表,多个用逗号隔开
--recursion-method 指定复制检查的方式,默认为processlist,hosts
h= Master的地址
u= 用户名
p= 密码
P= 端口
-- 从库需要开启slave;
start slave;
show slave status\G

-- 主库processlist可以查到slave
mysql> show processlist;
+--------+-------------+---------------+------+------------------+--------+---------------------------------------------------------------+------------------+
| Id     | User        | Host          | db   | Command          | Time   | State                                                         | Info             |
+--------+-------------+---------------+------+------------------+--------+---------------------------------------------------------------+------------------+
|      2 | system user |               | NULL | Connect          | 589655 | Slave has read all relay log; waiting for more updates        | NULL             |
|   2049 | slave       | mysql02:37382 | NULL | Binlog Dump GTID | 587611 | Master has sent all binlog to slave; waiting for more updates | NULL             |
| 588590 | root        | localhost     | NULL | Query            |      0 | starting                                                      | show processlist |
+--------+-------------+---------------+------+------------------+--------+---------------------------------------------------------------+------------------+
3 rows in set (0.03 sec)
# 执行检查命令,注意第一次添加--create-replicate-table参数创建表
[root@mysql01 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test2.checksums --create-replicate-table --databases=test h=192.168.41.141,u=pt,p=123456,P=3306
            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
08-05T17:35:54      0      1       13       1       0   0.091 test.t_department
08-05T17:35:54      0      0        8       1       0   0.202 test.testttt

# 结果字段说明
# TS :完成检查的时间。
# ERRORS :检查时候发生错误和警告的数量。
# DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
# ROWS :表的行数。
# CHUNKS :被划分到表中的块的数目。
# SKIPPED :由于错误或警告或过大,则跳过块的数目。
# TIME :执行的时间。
# TABLE :被检查的表名。

[root@mysql01 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test2.checksums --no-replicate-check  --databases=test h=192.168.41.141,u=pt,p=123456,P=3306
            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
08-06T09:30:43      0      0       13       1       0   0.023 test.t_department
08-06T09:30:43      0      0        8       1       0   0.033 test.testttt
[root@mysql01 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test2.checksums --replicate-check-only --databases=test h=192.168.41.141,u=pt,p=123456,P=3306
Differences on mysql02
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
test.t_department 1 0 1 

pt-table-sync

pt-table-sync: 高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据。他可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。

# 参数解释:
# --replicate= :   指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。
# --databases= :    指定执行同步的数据库。
# --tables= :      指定执行同步的表,多个用逗号隔开。
# --sync-to-master :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。
# h= :             服务器地址,命令里有2个ip,第一次出现的是Master的地址,第2次是Slave的地址。
# u= :             帐号。
# p= :             密码。
# --print :        打印,但不执行命令。打印出来修复数据的sql语句,可以手动的在slave从库上执行,让他们数据保持一致性
# --execute :      执行命令。

[root@mysql01 ~]# pt-table-sync --replicate=test2.checksums h=192.168.41.141,u=pt,p=123456 h=192.168.41.142,u=pt,p=123456 --print
REPLACE INTO `test`.`t_department`(`department_id`, `department_name`, `parent_id`, `level`, `create_time`, `update_time`) VALUES ('7', '8', '0', '1', '2020-07-28 16:06:40', '2020-07-28 16:06:40') /*percona-toolkit src_db:test src_tbl:t_department src_dsn:h=192.168.41.141,p=...,u=pt dst_db:test dst_tbl:t_department dst_dsn:h=mysql02,p=...,u=pt lock:1 transaction:1 changing_src:test2.checksums replicate:test2.checksums bidirectional:0 pid:114329 user:root host:mysql01*/;


[root@mysql01 ~]# pt-table-sync --replicate=test2.checksums h=192.168.41.141,u=pt,p=123456 h=192.168.41.142,u=pt,p=123456 --print --execute
REPLACE INTO `test`.`t_department`(`department_id`, `department_name`, `parent_id`, `level`, `create_time`, `update_time`) VALUES ('7', '8', '0', '1', '2020-07-28 16:06:40', '2020-07-28 16:06:40') /*percona-toolkit src_db:test src_tbl:t_department src_dsn:h=192.168.41.141,p=...,u=pt dst_db:test dst_tbl:t_department dst_dsn:h=mysql02,p=...,u=pt lock:1 transaction:1 changing_src:test2.checksums replicate:test2.checksums bidirectional:0 pid:115260 user:root host:mysql01*/;

# 同步之后再次查看,主从数据已经同步
[root@mysql01 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test2.checksums --databases=test h=192.168.41.141,u=pt,p=123456,P=3306
            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
08-06T09:36:23      0      0       13       1       0   0.293 test.t_department
08-06T09:36:23      0      0        8       1       0   0.018 test.testttt

可以编写脚本定时同步主备库数据

#!/bin/bash
NUM=$(/usr/bin/pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test2.checksums --databases=test  h=192.168.41.141,u=pt,p=123456,P=3306|awk -F" " '{print $3}'|sed -n '2p')
if [ $NUM -eq 1 ];then
  /usr/bin/pt-table-sync --replicate=test2.checksums h=192.168.41.141,u=pt,p=123456 h=192.168.41.142,u=pt,p=123456 --print --execute
else
  echo "data is ok"
fi

pt-heartbeat

对于MySQL数据库主从复制延迟的监控,可以借助pt-heartbeat来实现。

pt-heartbeat的工作原理通过使用时间戳方式在主库上更新特定表,然后在从库上读取被更新的时间戳然后与本地系统时间对比来得出其延迟。具体流程:

  1. 在主上创建一张heartbeat表,按照一定的时间频率更新该表的字段(把时间更新进去)。监控操作运行后,heartbeat表能促使主从同步!
  2. 连接到从库上检查复制的时间记录,和从库的当前系统时间进行比较,得出时间的差异。

参考链接

问题说明

mysql主从同步时难免出现问题导致数据不一致情况.此时需要手动将主从数据同步.

Maatkit是一个开源的工具包,为mySQL日常管理提供了帮助,它包含很多工具,这里主要说下面两个:

  • mk-table-checksum : 用来检测masterslave上的表结构和数据是否一致的;
  • mk-table-sync : 在主从数据不一致时,用来修复数据的;先主后从有效保证表一致的工具,不必重载从表而能够保证一致。

    上面两个perl脚本在运行时都会锁表,表的大小取决于执行的快慢,勿在高峰期间运行,可选择凌晨

安装Maatkit

  1. 安装依赖
# 安装依赖
yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI -y

yum install perl-ExtUtils-Embed perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker -y

yum -y install perl-Digest-MD5
  1. 下载maatkit
  1. 安装maatkit
# 解压进入目录
tar -zvxf maatkit-7540.tar.gz  && cd maatkit-7540 

[root@mysql01 maatkit-7540]# perl Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for maatkit

# 安装
make && make install

# 测试查看mk-相关命令
[root@mysql01 maatkit-7540]# mk-
mk-archiver               mk-duplicate-key-checker  mk-heartbeat              mk-log-player             mk-profile-compact        mk-query-profiler         mk-slave-move             mk-table-sync             mk-variable-advisor       
mk-checksum-filter        mk-error-log              mk-index-usage            mk-merge-mqd-results      mk-purge-logs             mk-show-grants            mk-slave-prefetch         mk-table-usage            mk-visual-explain         
mk-config-diff            mk-fifo-split             mk-kill                   mk-parallel-dump          mk-query-advisor          mk-slave-delay            mk-slave-restart          mk-tcp-model              
mk-deadlock-logger        mk-find                   mk-loadavg                mk-parallel-restore       mk-query-digest           mk-slave-find             mk-table-checksum         mk-upgrade                

工具使用

  1. 创建mysql检查帐号
-- 主从服务器上创建只有SELECT权限的帐号
mysql> GRANT SELECT ON *.* TO 'data_check'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.01 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
  1. 检查一致性
# 第一个h:   填写主库ip
# 第一个u:   主库授权的用户名
# 第一个p:   主库授权的密码
# 第二个h:   填写从库ip
# 第二个u:   从库授权的用户名
# 第二个p:   从库授权的密码
# 大写P:   mysql的端口
[root@mysql01 maatkit-7540]# mk-table-checksum h=192.168.41.141,u=data_check,p=123456,P=3306 h=192.168.41.142,u=data_check,p=123456,P=3306
DATABASE TABLE        CHUNK HOST           ENGINE      COUNT         CHECKSUM TIME WAIT STAT  LAG
test     t_department     0 192.168.41.141 InnoDB       NULL         83657212    0    0 NULL NULL
test     t_department     0 192.168.41.142 InnoDB       NULL       3344593131    0    0 NULL NULL
test     testttt          0 192.168.41.141 InnoDB       NULL       3722958311    0    0 NULL NULL
test     testttt          0 192.168.41.142 InnoDB       NULL       3722958311    0    0 NULL NULL
DATABASE TABLE                     CHUNK HOST           ENGINE      COUNT         CHECKSUM TIME WAIT STAT  LAG
mysql    columns_priv                  0 192.168.41.141 MyISAM       NULL                0    0    0 NULL NULL
mysql    columns_priv                  0 192.168.41.142 MyISAM       NULL                0    0    0 NULL NULL
mysql    db                            0 192.168.41.141 MyISAM       NULL       2629905140    0    0 NULL NULL
mysql    db                            0 192.168.41.142 MyISAM       NULL       2629905140    0    0 NULL NULL
mysql    engine_cost                   0 192.168.41.141 InnoDB       NULL       2678612005    0    0 NULL NULL
...


# 参数-d(或者--database) 指定要检查的数据库,多个数据库之间用逗号隔开,如果不加-d,校验的是所有库;
# --count    会计算出表的行数
[root@mysql01 maatkit-7540]# mk-table-checksum h=192.168.41.141,u=data_check,p=123456,P=3306 h=192.168.41.142,u=data_check,p=123456,P=3306 --count -dtest
DATABASE TABLE        CHUNK HOST           ENGINE      COUNT         CHECKSUM TIME WAIT STAT  LAG
test     t_department     0 192.168.41.141 InnoDB         13         5e339d70    0    0 NULL NULL
test     t_department     0 192.168.41.142 InnoDB         13         7a4c9153    0    0 NULL NULL
test     testttt          0 192.168.41.141 InnoDB          8         41db7636    0    0 NULL NULL
test     testttt          0 192.168.41.142 InnoDB          8         41db7636    0    0 NULL NULL

# 结果参数说明
# DATABASE      检查的库名
# TABLE:       检查的库中的表名
# CHUNK:       checksum时的近似数值
# HOST:        主从MYSQL的地址
# ENGINE:      表引擎
# COUNT:       表的行数
# CHECKSUM:    校验值
# TIME:        所用时间
# WAIT:        等待时间
# STAT:        MASTER_POS_WAIT()返回值
# LAG:         slave的延时时间


# mk-checksum-filter过滤出不一样的结果
[root@mysql01 maatkit-7540]# mk-table-checksum h=192.168.41.141,u=data_check,p=123456,P=3306 h=192.168.41.142,u=data_check,p=123456,P=3306 --count -dtest | mk-checksum-filter
test     t_department     0 192.168.41.141 InnoDB         13         5e339d70    0    0 NULL NULL
test     t_department     0 192.168.41.142 InnoDB         13         7a4c9153    0    0 NULL NULL
  1. 修复主从不同步的数据

mk-table-sync用来修复多个实例之间数据的不一致. mk-table-sync的工作方式是:先一行一行检查主从库的表是否一样,如果哪里不一样,就执行删除,更新,插入等操作,使其达到一致。

由于上面在mk-table-checksum检查时用的data_check只有select权限,权限太小,不能用于mk-table-sync修复数据只用。
所以还需要在主库和从库数据库里创建用于mk-table-sync修复数据之用的账号权限

mysql> GRANT ALL ON *.* to mksync@'%' identified by "123456";
Query OK, 0 rows affected (0.01 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
# 注意:主从数据库表和表结构必须一致,否则会报错!
# --print               显示同步需要执行的语句
# --execute             执行数据同步
# --charset=utf8mb4     设置字符集,避免从库乱码。
# --no-check-slave      如果不加这个参数,会提示报错,因为此工具默认不允许在从库上修改数据
# -t                    指定同步的表名,多个表时可以在-t后加=号,即-t=tables1,tables2,..
# > /root/result        命令后面加上 > /root/result 将结果导出

[root@mysql01 maatkit-7540]# mk-table-sync --execute --charset=utf8mb4 --print --no-check-slave --databases test h=192.168.41.141,u=mksync,p=123456,P=3306 h=192.168.41.142,u=mksync,p=123456,P=3306
UPDATE `test`.`t_department` SET `department_name`='44', `parent_id`='0', `level`='1', `create_time`='2020-07-28 16:06:24', `update_time`='2020-07-28 16:06:24' WHERE `department_id`='3' LIMIT 1 /*maatkit src_db:test src_tbl:t_department src_dsn:A=utf8mb4,P=3306,h=192.168.41.141,p=...,u=mksync dst_db:test dst_tbl:t_department dst_dsn:A=utf8mb4,P=3306,h=192.168.41.142,p=...,u=mksync lock:0 transaction:1 changing_src:0 replicate:0 bidirectional:0 pid:3869 user:root host:mysql01*/;
# 修复之后检查主从,通过CHECKSUM可以看出,数据已经完全一样了
[root@mysql01 maatkit-7540]# mk-table-checksum h=192.168.41.141,u=data_check,p=check@123,P=3306 h=192.168.41.142,u=data_check,p=check@123,P=3306 --count -dtest
DATABASE TABLE        CHUNK HOST           ENGINE      COUNT         CHECKSUM TIME WAIT STAT  LAG
test     t_department     0 192.168.41.141 InnoDB         13         5e339d70    0    0 NULL NULL
test     t_department     0 192.168.41.142 InnoDB         13         5e339d70    0    0 NULL NULL
test     testttt          0 192.168.41.141 InnoDB          8         41db7636    0    0 NULL NULL
test     testttt          0 192.168.41.142 InnoDB          8         41db7636    0    0 NULL NULL

参考链接

说明

  • Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。

  • Redis 4.0 开始就有多线程的概念了,比如 Redis 通过多线程方式在后台删除对象、以及通过 Redis 模块实现的阻塞命令等。

  • Redis 6.0 网络处理多线程,指的是在网络 IO 处理方面上了多线程,如网络数据的读写和协议解析等,需要注意的是,执行命令的核心模块还是单线程的。

  • Redis 的瓶颈并不在 CPU,而在内存和网络。内存不够的话,可以加内存或者做数据结构优化和其他优化等,但网络的性能优化才是大头,网络 IO 的读写在 Redis 整个执行期间占用了大部分的 CPU 时间,如果把网络处理这部分做成多线程处理方式,那对整个 Redis 的性能会有很大的提升。

IO多路复用

-