DB优化

TIDB 安装

2018-07-18  本文已影响82人  我只是一个小白

小白版本的安装入门,欢迎新手来参考😁

系统初始化(选择59作为中控机)

注意:推荐安装时,不使用 root 用户,而是使用 tidb 用户


# 检查文件系统

# cat /etc/fstab
/dev/vdb1 /data1 ext4 nodelalloc 0 0


# 生成秘钥

# useradd tidb
# passwd tidb
# su - tidb

# ssh-keygen -t rsa

# 下载 tidb-ansible master

# git clone https://github.com/pingcap/tidb-ansible.git

# 安装 ansible 的依赖

# sudo yum -y install epel-release 

# sudo yum -y install python-pip curl

# cd tidb-ansible/

# sudo pip install -r ./requirements.txt

# ansible --version


# 使用 tidb-ansible 配置秘钥

# vi hosts.ini
[servers]
172.16.10.59
172.16.10.60
172.16.10.61
172.16.10.62
[all:vars]
username = tidb

# 按照顺序输入密码

# ansible-playbook -i hosts.ini create_users.yml -k

注意:这里的互信是看官网的,实际操作是直接在59那台服务器生成公钥,然后将内容复制到每台服务器的 home 目录下 .ssh/ 下的 authorized_keys 文件内。最后的目标是通过中控机可以访问无秘钥登录其他服务器 tidb 账户,每台服务器的 tidb 账户可以通过 sudo su - root 直接切换到 root 用户,这样互信就完成了,下文有检查互信的方法。


[tidb@ip-172-16-10-59 tidb-ansible]$ ntpstat
synchronised to NTP server (85.199.214.100) at stratum 2 
   time correct to within 159 ms
   polling server every 1024 s

注意:这个可以在配置文件里面关闭,主要是为了保证服务器时间统一,正式服务器不可关闭,测试可以。

安装配置


vim inventory.ini

修改内容参考官方

注意:user 改为 tidb 用户,注意下载的 tidb 的版本


ansible -i inventory.ini all -m shell -a 'whoami'

ansible -i inventory.ini all -m shell -a 'whoami' -b


ansible-playbook local_prepare.yml


ansible-playbook bootstrap.yml

注意

如果这个地方配置没有通过,如修改 `/home/tidb/wangjun/tidb-ansible/roles/check_system_optional/defaults/main.yml` 里面的限制,注意看报错模块,一般都是在 roles 文件夹下,defaults 文件夹下的 yml 文件中是阈值。

为了提高初始化系统环境的速度,可以修改 io 测试模块中,生成文件的大小,默认是10G。

或者跳过

bootstrap.yml 阶段如何跳过磁盘检测、CPU、内存容量检测

ansible-playbook bootstrap.yml --extra-vars "dev_mode=True"


ansible-playbook deploy.yml


ansible-playbook start.yml

部署完成

注意:

Grafana Dashboard 上的 Report 按钮可用来生成 PDF 文件,此功能依赖 fontconfig 包。如需使用该功能,登录 grafana_servers 机器,用以下命令


sudo yum install fontconfig -y

集群入门使用


mysql -uroot -P4000 -h 172.16.10.59

注意:

1.需要接 ip,不然默认 socket 接入是有问题的

2.MySQL 命令可以找一个,上传上去

3.没有初始化密码,注意设置初始密码


地址:http://172.16.10.59:3000 

默认帐号密码是:admin/admin

注意:如果修改了 admin 的密码,及时修改 inventor.ini 配置文件中的相关配置。

滚动升级

1.滚动升级,不影响业务运行的话,最低的配置为:pd*3 ,tidb*2 ,tikv*3

2.如果集群环境中有 pump / drainer 服务,请先停止 drainer 后滚动升级 (升级 TiDB 时会升级 pump)


# 原先的版本

./resources/bin/tidb-server -V



# 删除原来的安装包

rm -rf downloads/



# 修改配置

vim inventory.ini

tidb_version = v1.0.2



# 下载

ansible-playbook local_prepare.yml




# 现在的版本

./resources/bin/tidb-server -V


# 滚动升级所有(可指定升级部分)

ansible-playbook rolling_update.yml



# 更新 Prometheus 配置并重启
ansible-playbook rolling_update_monitor.yml --tags=prometheus

扩容

添加一个 tidb


# 添加新 tidb 的 IP

vim inventory.ini



# 初始化新增节点(多个IP 用逗号隔开,--tags=tidb 参数指定服务,-l 可以接 ip 或者服务的别名,为了 单 node 多 tikv 部署的情况使用)

ansible-playbook bootstrap.yml -l 172.16.10.61



# 部署新增节点
ansible-playbook deploy.yml -l 172.16.10.61



# 启动新节点服务
ansible-playbook start.yml -l 172.16.10.61



# 更新 Prometheus 配置并重启
ansible-playbook rolling_update_monitor.yml --tags=prometheus

添加一个 pd


# 修改 inventory.ini 配置文件

[pd_servers]

172.16.10.59



# 初始化新增节点

ansible-playbook bootstrap.yml -l 172.16.10.59



# 部署新节点

ansible-playbook deploy.yml -l 172.16.10.59 --tags=pd



# 注意 这里需要上新增 pd 服务器中手动修改配置文件

## 修改 vim scripts/run_pd.sh

### 删除:

--initial-cluster="pd1=http://172.16.10.59:2380,pd2=http://172.16.10.60:2380,pd3=http://172.16.10.61:2380,pd4=http://172.16.10.62:2380" \

### 添加:

--join="http://172.16.10.60:2379" \

### 注意:

1.端口为2379

2.修改 inventory.ini 配置文件时,新加 pd 的 ip 加在最后,因为 run_pd.sh 的脚本中有个name 的属性,里面的名字是 pd+顺序 id 拼接的,如果写的位置不是最后一个,可能会造成这个属性冲突。

## 手动启动

./scripts/start_pd.sh

在中控机上使用 pd-ctl 命令看 member 信息

## 滚动升级,更新所有其他节点记录的pd 信息和相关脚本

ansible-playbook rolling_update.yml

## 更新 Prometheus 配置并重启

ansible-playbook rolling_update_monitor.yml --tags=prometheus

删除59新添的 pd


# 1.使用 pd-ctl 命令查看59的 pd name,并根据 pd name 将其移除pd 集群

./resources/bin/pd-ctl -u http://172.16.10.60:2379 -d member

./resources/bin/pd-ctl -u http://172.16.10.60:2379 -d member delete name pd4



# 2.关闭59上 pd 的服务

ansible-playbook stop.yml -l 172.16.10.59 --tags=pd



# 3.注释掉 inventory.ini 59服务器的 pd 配置

# 4.滚动更新 prometheus

ansible-playbook rolling_update_monitor.yml --tags=prometheus

缩容

剔除61的 tidb


# 关闭 61服务器中的tidb 服务

ansible-playbook stop.yml -l 172.16.10.61 --tags=tidb



# 注释 61服务器

vim inventory.ini

## TiDB Cluster Part

[tidb_servers]

172.16.10.59

172.16.10.60

#172.16.10.61



# 更新 prometheus

ansible-playbook rolling_update_monitor.yml --tags=prometheus

思路:

剔除61的 tikv


# 中控机使用 pd-ctl 命令远程剔除

# pd-ctl 命令寻找

[tidb@ip-172-16-10-59 tidb-ansible]$ sudo find / -name pd-ctl*

/home/tidb/wangjun/tidb-ansible/resources/bin/pd-ctl

/home/tidb/wangjun/tidb-ansible/scripts/pd-ctl.sh

/home/tidb/wangjun/tidb-ansible/roles/ops/templates/pd-ctl.sh.j2



# 1.查看 pd 中需要剔除 tikv 的 store id

./resources/bin/pd-ctl -u "http://172.16.10.61:2379" -d store



# 2.根据 store id 去剔除 tikv

./resources/bin/pd-ctl -u "http://172.16.10.61:2379" -d store delete 5



# 3.关闭对应的 tikv

ansible-playbook stop.yml -l 172.16.10.61 --tags=tikv



# 4.注释掉 ini 配置文件中的 IP

ansible-playbook rolling_update_monitor.yml --tags=prometheusvim inventory.ini 



# 5.更新掉 prometheus

ansible-playbook rolling_update_monitor.yml --tags=prometheus

思路:

再次将61的 tikv 添加到集群


# 删除 tikv 余留的物理文件

ansible-playbook unsafe_cleanup_data.yml -l 172.16.10.61 --tags=tikv

# 发现未生效,直接物理删除 data/ 目录,不删除,无法添加成功



# 按照添加 tidb 的方式,将 tikv 添加回集群,添加成功

tikv 多实例


# 关闭集群

ansible-playbook stop.yml

# 销毁集群

ansible-playbook unsafe_cleanup.yml



# 单机多 tikv 部署

vim inventory.ini

TiKV1-1 ansible_host=172.16.10.60 deploy_dir=/data1/wj_deploy_1 tikv_port=20171 labels="host=tikv1"

TiKV1-2 ansible_host=172.16.10.60 deploy_dir=/data1/wj_deploy_2 tikv_port=20172 labels="host=tikv1"

TiKV2-1 ansible_host=172.16.10.61 deploy_dir=/data1/wj_deploy_1 tikv_port=20171 labels="host=tikv2"

TiKV2-2 ansible_host=172.16.10.61 deploy_dir=/data1/wj_deploy_2 tikv_port=20172 labels="host=tikv2"

TiKV3-1 ansible_host=172.16.10.62 deploy_dir=/data1/wj_deploy_1 tikv_port=20171 labels="host=tikv3"

TiKV3-2 ansible_host=172.16.10.62 deploy_dir=/data1/wj_deploy_2 tikv_port=20172 labels="host=tikv3"

...

[pd_servers:vars]

# location_labels = ["zone","rack","host"]

location_labels = ["host"]

[all:vars]

deploy_dir = /data1/wj_deploy

tidb_version = v2.0.0



# 配置 vim conf/tikv.yml(算法参考官网)

## 1.block-cache-size 配置(内存)

### 配置 rocksdb defaultcf 下的 block-cache-size

block-cache-size: "1024MB"

### 配置 rocksdb writecf 下的 block-cache-size

block-cache-size: "1280MB"

### 配置 rocksdb lockcf 下的 block-cache-size

block-cache-size: "145MB"


### 配置 raftdb defaultcf 下的 block-cache-size

block-cache-size: "145MB"


## 2.concurrency 配置(CPU)
### 配置 readpool 下的 high-concurrency、normal-concurrency 和 low-concurrency 三个参数
high-concurrency: 2
normal-concurrency: 2
low-concurrency: 2

## 3.磁盘配置
### 配置 raftsore 下的 capacity 参数
capacity: "40G"

# 正常部署即可

tidb-binlog 集群搭建(ansible 部署方式)

a)binlog 是由 pump 生成,并异步写入到 kafka;

b)Kafka & ZooKeeper:存储 pump 推来的日志,并且给 drainer 读取

kafka 集群部署


# 中控机下载 kafka-ansible

git clone https://github.com/pingcap/thirdparty-ops.git

cd kafka-ansible



# 配置 inventory.ini (配置内容具体看参考文件)

[zookeeper_servers]
zk1 ansible_host=172.16.10.59 deploy_dir=/home/tidb/wj_zk_deploy myid=1
zk2 ansible_host=172.16.10.60 deploy_dir=/home/tidb/wj_zk_deploy myid=2
zk3 ansible_host=172.16.10.61 deploy_dir=/home/tidb/wj_zk_deploy myid=3
[kafka_servers]
kafka1 ansible_host=172.16.10.59 deploy_dir=/home/tidb/wj_kafka_deploy data_dirs=/data1/kafka_data,/data1/kafka_data_2 kafka_port=9092 id=1

kafka2 ansible_host=172.16.10.60 deploy_dir=/home/tidb/wj_kafka_deploy data_dirs=/data1/kafka_data,/data1/kafka_data_2 kafka_port=9092 id=2

kafka3 ansible_host=172.16.10.61 deploy_dir=/home/tidb/wj_kafka_deploy data_dirs=/data1/kafka_data,/data1/kafka_data_2 kafka_port=9092 id=3


# 开始部署

## 下载需要的包

ansible-playbook -i inventory.ini local_prepare.yml

## 初始化系统环境,修改内核参数

ansible-playbook -i inventory.ini bootstrap.yml --extra-vars "dev_mode=True"

## 安装依赖包

ansible-playbook -i inventory.ini deploy.yml

## 启动服务

ansible-playbook -i inventory.ini start.yml

如果发现 kafka 启动失败,日志打印内存不足,可以配置 inventory.ini 中的 kafka_heap_size 大小

kafka监控


# 进入 tidb-ansible 安装目录,修改 inventory.ini 配置

vim inventory.ini

[kafka_exporter_servers]

172.16.10.59



# 更新监控

ansible-playbook rolling_update_monitor.yml

ansible 部署 pump


ansible-playbook -i inventory.ini stop.yml --tags=tidb


enable_binlog = True

zookeeper_addrs = "172.16.10.59:2181,172.16.10.60:2181,172.16.10.61:2181"

kafka_addrs = "172.16.10.59:9092,172.16.10.60:9092,172.16.10.61:9092"


 ansible-playbook -i inventory.ini deploy.yml --tags=tidb


ansible-playbook -i inventory.ini start.yml --tags=tidb

部署 drainer


# 1.解压下载的包

wget http://download.pingcap.org/tidb-binlog-latest-linux-amd64.tar.gz

tar -zxvf tidb-binlog-latest-linux-amd64.tar.gz

cd tidb-binlog-latest-linux-amd64/



# 2.配置配置文件,参考(https://pingcap.com/docs-cn/tools/tidb-binlog-kafka/#tidb-binlog-%E9%83%A8%E7%BD%B2%E6%96%B9%E6%A1%88)

vim drainer.toml



# 3.启动

./bin/drainer -config drainer.toml &

注意:drainer 下游有两种:

1.db-type 配置为 mysql,使用流复制,传输到 mysql 中

2.db-type 配置为 pb,存放到 binlog 日志目录下

注意2:

经过测试,如果同步有错误,比如上游 tidb 创建一个库下游 mysql 已经存在,这样的话 drainer 会重试5次,如果不成功,自动跳过。

如果是 dml 语句,为了避免数据丢失,会一直重试。

监控


# 修改启动脚本

[tidb@ip-172-16-10-59 tidb-binlog-latest-linux-amd64]$ cat run_drainer.sh 

#!/bin/bash

set -e

ulimit -n 1000000



DEPLOY_DIR=/home/tidb/wangjun/tidb-binlog-latest-linux-amd64



cd "${DEPLOY_DIR}" || exit 1



# WARNING: This file was auto-generated. Do not edit!

# All your edit might be overwritten!



exec bin/drainer \

        --config=drainer.toml \

        --metrics-addr=172.16.10.59:9091 \

# --metrics-interval = 15 \

PbReader工具部署

解析 binlog 的工具


# 注意配置 drainer 的配置文件,开启 pd 模式

# 下载使用

wget http://download.pingcap.org/pb_reader-latest-linux-amd64.tar.gz

tar -zxvf pb_reader-latest-linux-amd64.tar.gz 

cd pbReader

bin/pbReader -binlog-file=../data.drainer/binlog-0000000000000000-20180615110715

上一篇下一篇

猜你喜欢

热点阅读