1、nload,左右键切换网卡
2、sudo iftop
3、sudo iptraf 按连接/端口查看流量
4、sudo nethogs: 按进程查看流量占用
5、ss: 连接查看工具
6、dstat -nf
1、nload,左右键切换网卡
2、sudo iftop
3、sudo iptraf 按连接/端口查看流量
4、sudo nethogs: 按进程查看流量占用
5、ss: 连接查看工具
6、dstat -nf
本规范旨在帮助开发人员逐步建立合理使用数据库的意识,对数据库相关的资源申请、业务规范使用等提供规范性的指导,从而为公司业务系统稳定、健康地运行提供保障。
以下所有规范会按照【强制】、【建议】两个级别进行标注,对于【强制】级别的设计需强制修改调整。
[TOC]
命名规范的对象,是指数据库SCHEMA、表TABLE、字段COLUMN、索引INDEX、约束CONSTRAINTS等
dba内部账户以dba_开头;
应用账户以user_开头:如user_upc、user_upc_r 分别代表读写、只读账号;
读写分离不提供额外账户,统一使用应用账户;
所有账户必须都在主库创建,只读查询只能从非候选上操作;
db_00{table_00 - table_31}
db_01{table_00 - table_31}
db_02{table_00 - table_31}
db_03{table_00 - table_31}
解读:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高;
解读:万国码,无需转码,无乱码风险,节省空间,utf8mb4更可保存emoj表情(utf8不行);
解读:N年后鬼知道这个r1,r2,r3字段是干嘛的
解读:
a)主键递增,数据行写入可以提高插入性能,可避免page分裂,减少表碎片提升空间和内存的使用
b)主键要选择较短的数据类型,Innodb引擎普通索引都会保存主键的值,较短的数据类型可以有效的减少索引的磁盘空间,提高索引的缓存效率
c)无主键的表删除,在row模式的主从架构,会导致备库夯住
解读:外键使得表之间相互耦合,影响update/delete等SQL性能,有可能造成死锁,高并发情况下容易成为数据库瓶颈
解读:浮点数(float和double)在存储的时候,超过指定精度后会四舍五入,这是浮点数特有的问题。因此在精度要求比较高的应用中(比如货币)要使用定点数(decimal)而不是浮点数(float和double)来保存数据。
对于长度基本固定的小字符类型,如果该列恰好更新又特别频繁,适合char
不固定长度的大字符类型,应选择varchar类型,varchar(N),N代表的是字符数,N尽可能的小
varchar虽然存储变长字符串,UTF8最多能存21844个汉字,或65532个英文
使用tinyint来代替 enum和boolean
使用Decimal 代替float/double存储精确浮点数
建议使用 UNSIGNED 存储非负数值
int使用固定4个字节存储,int(11)与int(4)只是显示宽度的区别
列禁止使用bit类型,请用tinyint类型替代。bit类型加了索引可能会导致sql结果不准。
timestamp可以在insert/update行时,自动更新时间字段;
列为timestamp类型,必须指定默认值,要么current_timestamp,要么'1970-01-02 01:01:01',不要设置为''或0;
解读:DATETIME和TIMESTAMP都可用来表示YYYY-MM-DD HH:MM:SS类型的日期。两种都保存日期和时间信息,毫秒部分最高精确度都是6位数。建议使用TIMESTAMP(3)。
A. TIMESTAMP占用4字节,DATETIME占用8字节,当保存毫秒部分时两者都使用额外的空间 (1-3 字节)。
B. TIMESTAMP的取值范围比DATETIME小得多,不适合存放比较久远的日期。TIMESTAMP只能存储从 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999' 之间的时间。而DATETIME允许存储从 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999' 之间的时间。
C. TIMESTAMP的插入和查询受时区的影响。如果记录的日期需要让不同时区的人使用,最好使用 TIMESTAMP。
解读:ip转int使用 INET_ATON 函数,int转ip使用 INET_NTOA 函数,比如:select inet_aton(‘192.168.1.1’),inet_ntoa(3232235777);
解读:
1)涉及到国家代号,可能出现+/-/()等字符,例如+86
2)手机号不会用来做数学运算
3)varchar可以模糊查询,例如 like '138%'
选择性的计算方式为: select count(distinct(col_name))/count(*) from tb_name
如果结果小于0.2,则不建议在此列上创建索引,否则大概率会拖慢SQL执行
解读:前缀索引的缺点是,如果在该列上 ORDER BY 或 GROUP BY 时无法使用索引,也不能把它们用作覆盖索引(Covering Index)
关于组合索引的几点建议
解读:如果5个字段还不能极大缩小row范围,八成是设计有问题
比如索引idx_a_b_c(a,b,c),相当于创建了(a)、(a,b)、(a,b,c)三个索引,后二者为冗余索引:
①where a=? 用到(a) ⑦where c=? 用不到
②where b=? and a=? 用到(a,b) ⑧where b=? and c=? 用不到
③where a=? and c=? 用到(a)
④where a>? and b=? 用到(a)
⑤where a=? and b=? and c>? 用到(a,b,c)
⑥where a=? and b>? and c=? 用到(a,b)
解读:高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。数据库擅长存储与索引,涉及CPU计算的还是放到应用服务器上吧
解读:指定字段插入,在表结构变更时,能保证对应用程序无影响
SELECT * FROM tel_record t1 INNER JOIN (SELECT id FROM tel_record WHERE qiye_id = xxx ORDER BY id DESC LIMIT 999900,100) t2 ON t1.f_id = t2.f_id;
程序端保留当前页的最小id、最大id(id是主键),降序情况下,每次提取下一页的数据时,id < min_id order by id desc limit 100; 上一页 id > max_id order by id desc limit 100
解读:增加新的ENUM值要做DDL操作;ENUM的内部实际存储就是整数而非字符串;
解读:旧版本mysql的OR查询是不能命中索引的,即使能命中索引,为何要让数据库耗费更多的CPU帮助实施查询优化呢? 补充:通常情况下,如果条件中有or,即使其中有条件带索引也不会使用,所以除非每个列都建立了索引,否则不建议使用OR。在多列OR中,建议用UNION ALL替换。
例如,where 条件里面有<>、not in 、not exists的时候,即便是在这些判断字段上加有索引,也不会起作用。
解读:
A.不要使用count(列名)或者count(常量)来替代 count(*),count(*)是SQL92定义的标准统计行数的语法,跟数据库无关,跟null和非null无关。count(*)会统计值为null的行,而count(列名)不会统计此列为null的行。
B.count(distinct col)计算该列除null之外不重复的行数。count(distinct col1, col2),如果其中一列全为null,那么即使另一列有不同的值,也返回0
C.当某一列的值全为null,count(col)的返回结果为0,但sum(col)的返回结果为null,因此使用sum()时需要注意空指针异常的问题。可以使用ISNULL()来判断是否为NULL值: SELECT IF(ISNULL(SUM(g)), 0, SUM(g)) FROM table;
关于应用软件版本的选择,推荐使用官方、最新的LTS版(长期支持版本)。
注:LTS(Long-Term Support)版本被认为是最稳定的版本,它经历了广泛的测试,并且大多包含了多年积累的改进。注:此文更新日期 2023-09-08
| 系统名称 | 推荐的版本 | 发布日期 | 官方地址 |
|---|---|---|---|
| CentOS | CentOS 7.9 | 2014-06-10 | https://www.centos.org/centos-linux |
| Red Hat | Red Hat Enterprise Linux release 8.6 | 2022-05-10 | https://developers.redhat.com/products/rhel/download |
| 银河麒麟 | Kylin Server V10 SP3 | 2023-04-28 | https://www.kylinos.cn |
| Ubuntu | Ubuntu 22.04.2 LTS | 2023-02-23 | https://cn.ubuntu.com/download/server/step1 |
| openEuler | openEuler 22.03 LTS SP2 | 2022-04-15 | https://www.openeuler.org/zh/download |
| Oracle Linux | Oracle Linux 9.3 | 2024-04-23 | https://yum.oracle.com/oracle-linux-isos.html |
| Windows | Windows Server 2022 | 2021-11-05 | https://www.microsoft.com/zh-CN/windows-server |
| 虚拟化 | Proxmox VE 7.4-1 | 2023-03-23 | https://pve.proxmox.com/wiki/Downloads |
| VMware 服务端 | VMware vSphere Hypervisor (ESXi) 8.0U1a | 2023-06-01 | https://customerconnect.vmware.com/en/downloads |
| VMware 个人版 | VMware Workstation 17.0.2 Pro | 2023-04-25 | https://www.vmware.com/products/workstation-pro.html |
| VirtualBox | 7.0.12 | 2023-10-17 | https://www.virtualbox.org/wiki/Downloads |
| 软件名称 | 当前最新的版本 | 发布日期 | 官方地址 |
|---|---|---|---|
| Redis | 7.0.11 | 2023-04-17 | https://redis.io/download |
| MySQL | 8.0.32 | 2023-03-20 | https://www.percona.com/downloads https://downloads.mysql.com/archives |
| MongoDB | 6.0.6 | 2023-05-12 | https://www.mongodb.com/try/download/community https://www.mongodb.com/try/download/shell |
| PostgreSQL | 15.3 | 2023-05-11 | https://www.postgresql.org/download |
| SQL Server | 2022 | 2022-11-16 | https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads |
| SSMS | 19.1 | 2023-05-24 | https://docs.microsoft.com/en-us/sql/ssms |
| Oracle | 21c | 2021-08-13 | https://docs.oracle.com/en/database/oracle/oracle-database/index.html |
| TiDB | 7.1.0 | 2023-05-31 | https://docs.pingcap.com/zh/tidb/stable/release-notes |
| Couchbase | 7.6.0 | 2024-03 | https://www.couchbase.com/downloads |
| Memcached | 1.6.30 | 2024-09-05 | https://memcached.org/downloads |
| Archery | v1.9.1 | 2022-10-07 | https://github.com/hhyo/archery/releases |
| sqle | v2.2304.0 | 2023-04-28 | https://github.com/actiontech/sqle/releases |
| Yearning | v3.1.4 | 2023-04-24 | https://github.com/cookieY/Yearning/releases |
| 软件名称 | 当前最新的版本 | 发布日期 | 官方地址 |
|---|---|---|---|
| JDK | 1.8.0_381 | 2023-03-21 | https://www.oracle.com/java/technologies/downloads |
| OpenJDK | 20.0.2 | 2023-06-14 | https://jdk.java.net/archive (开源jdk,但也是oracle维护) |
| Python | 3.11.3 | 2023-04-05 | https://www.python.org/downloads |
| Node.js | v20.12.1 | 2024-04-03 | https://nodejs.org/en/download |
| Nginx | 1.25.0 | 2023-05-23 | https://nginx.org/en/download.html |
| Apache httpd | 2.4.57 | 2023-04-06 | https://httpd.apache.org/download.cgi |
| Apache Tomcat | 10.1.9 | 2023-05-19 | https://tomcat.apache.org |
| Apache Log4j | 2.20.0 | 2023-02-17 | https://logging.apache.org/log4j/2.x/download.html |
| OpenSSL | 3.1.0 | 2023-03-14 | https://www.openssl.org/source |
| MinIO | RELEASE.2023-09-07 | 2023-09-07 | https://min.io/download#/linux https://dl.min.io/server/minio/release |
| MinIO Client | RELEASE.2023-09-07 | 2023-09-07 | https://dl.min.io/client/mc/release |
| xxl-job | 2.4.0 | 2023-03-23 | https://github.com/xuxueli/xxl-job/releases |
| ZooKeeper | 3.8.1 | 2023-01-30 | https://zookeeper.apache.org/releases.html |
| ElasticSearch | 8.7.1 | 2023-05-03 | https://www.elastic.co/cn/downloads/elasticsearch |
| org.kie/drools | 8.39.0.Final | 2023-05-25 | https://www.drools.org/download/download.html |
| Go | 1.20.5 | 2023-02-01 | https://golang.google.cn/dl |
| Maven | 3.9.3 | 2023-06-26 | https://maven.apache.org/download.cgi https://maven.apache.org/docs/history.html |
| Metabase | 0.50.6 | 2024-06-19 | https://github.com/metabase/metabase/releases |
| antd | 5.8.6 | 2023-09-02 | – |
| element-ui | 2.15.4 | 2021-08-03 | – |
| dva | 2.6.0-beta.19 | 2019-11-21 | – |
| umi | 4.0.79 | 2023-09-01 | – |
| react | 18.2.0 | 2022-06-15 | – |
| react-dom | 18.2.0 | 2022-06-15 | – |
| webpack | 5.88.2 | 2023-07-13 | – |
| 软件名称 | 当前最新的版本 | 发布日期 | 官方地址 |
|---|---|---|---|
| Nacos | 2.2.4 | 2023-06-20 | https://github.com/alibaba/nacos/tags |
| seata | v2.0.0 | 2023-11-24 | https://github.com/seata/seata/tags |
| Spring Cloud Alibaba | 2022.0.0.0 | 2023-07-25 | https://sca.aliyun.com/zh-cn/version/version |
| vue | 2.7.14 | 2022-11-09 | – |
| vuex | 3.6.2 | 2021-01-26 | – |
| vue-router | 3.6.5 | 2022-09-06 | – |
| apisix | – | – | – |
| Apollo | – | – | – |
| Sentinel | – | – | – |
| 分类 | 网站用途 | 下载地址 |
|---|---|---|
| linux | 基于linux的rpm下载 | http://rpm.pbone.net |
| linux | 基于linux的rpm下载-推荐 | https://rpmfind.net/linux/rpm2html/search.php |
| ubuntu | 基于ubuntu的deb下载-官方-推荐 | https://packages.ubuntu.com |
| ubuntu | 基于ubuntu的deb下载 | https://launchpad.net/ubuntu |
| 不限os系统 | 华为云-镜像库 | https://mirrors.huaweicloud.com/repository |
| 不限os系统 | 清华大学-开源软件镜像站 | https://mirrors.tuna.tsinghua.edu.cn |
| 信创-麒麟 | 麒麟V10的rpm源 | https://update.cs2c.com.cn/NS/V10 |
| 信创-鲲鹏 | 华为云-镜像库-鲲鹏系统 | https://mirrors.huaweicloud.com/kunpeng |
| python | 基于python的package下载 | https://pypi.org |
| python | 基于Wheel格式的python包下载 | https://www.lfd.uci.edu/~gohlke/pythonlibs |
| 工具 | i tell you 工具资源下载 | https://msdn.itellyou.cn/ |
[TOC]
curl -sL 'http://iso.sqlfans.cn/docker/install_docker_2401.sh' | bash
docker --version
curl -sL 'http://iso.sqlfans.cn/docker/install_docker_compose_2181.sh' | bash
docker-compose --version
curl -sL http://iso.sqlfans.cn/jdk/install_openjdk_2002.sh | bash
source /etc/bashrc
java -version
curl -sL http://iso.sqlfans.cn/jdk/install_jdk_8u391.sh | bash
source /etc/bashrc
java -version
curl -sL http://iso.sqlfans.cn/linux/install_nodejs_16202.sh | bash
node -v
#.在线安装
# yum install -y gcc
#.离线安装
curl -L http://iso.sqlfans.cn/linux/gcc-4.8.5.tar.gz -o /opt/gcc-4.8.5.tar.gz
tar xvf /opt/gcc-4.8.5.tar.gz -C /opt/
rpm -Uvh /opt/gcc-4.8.5/*.rpm --nodeps --force
gcc --version
#.安装gcc及zlib这2个必要依赖
yum install -y gcc zlib zlib-devel
#.开始安装
curl -sL 'http://iso.sqlfans.cn/python/install_python_3123.sh' | bash
python3 --version
pip3 --version
#.基于 Python 2.7.5
curl -sL 'http://iso.sqlfans.cn/python/install_pip_1931.sh' | bash
pip --version
#.开始安装
cd /opt
wget -c http://iso.sqlfans.cn/linux/zlib-1.2.11.tar.gz
wget -c http://iso.sqlfans.cn/linux/pcre-8.44.tar.gz
wget -c http://iso.sqlfans.cn/linux/openssl-1.1.1g.tar.gz
wget -c http://iso.sqlfans.cn/linux/nginx-1.25.0.tar.gz
wget -c http://iso.sqlfans.cn/linux/nginx_openssl_conf.conf
wget -c http://iso.sqlfans.cn/linux/install_nginx_1250.sh
bash install_nginx_1250.sh
#.确认版本
/usr/local/nginx/sbin/nginx -version
#.ubuntu请改为:apt install -y libaio1 libaio-dev
#.开始安装
cd /opt
curl -L http://iso.sqlfans.cn/mysql/percona-server-5.7.44-48.tar.gz -o /opt/percona-server-5.7.44-48.tar.gz
curl -sL http://iso.sqlfans.cn/mysql/config/5.7/my_innodb.cnf -o /opt/my_innodb.cnf
curl -sL http://iso.sqlfans.cn/mysql/install_percona_5744.sh -o /opt/install_percona_5744.sh
bash install_percona_5744.sh /opt /data 3306
#.登录测试
mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3306.sock -e"select host,user,plugin,account_locked from mysql.user;"
#.开始安装
cd /opt
curl -L http://iso.sqlfans.cn/mysql/percona-server-8.0.32-24.tar.gz -o /opt/percona-server-8.0.32-24.tar.gz
curl -sL http://iso.sqlfans.cn/mysql/config/8.0/my_innodb.cnf -o /opt/my_innodb.cnf
curl -sL http://iso.sqlfans.cn/mysql/install_percona_8032.sh -o /opt/install_percona_8032.sh
bash install_percona_8032.sh /opt /data 3306
#.登录测试
mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3306.sock -e"select host,user,plugin,account_locked from mysql.user;"
#.开始安装
cd /opt
curl -L http://iso.sqlfans.cn/mysql/percona-server-8.4.0-1.tar.gz -o /opt/percona-server-8.4.0-1.tar.gz
curl -sL http://iso.sqlfans.cn/mysql/config/8.4/my_innodb.cnf -o /opt/my_innodb.cnf
curl -sL http://iso.sqlfans.cn/mysql/install_percona_8401.sh -o /opt/install_percona_8401.sh
bash install_percona_8401.sh /opt /data 3306
#.登录测试
mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3306.sock -e"select host,user,plugin,account_locked from mysql.user;"
#.开始安装
cd /opt/
wget -c http://iso.sqlfans.cn/redis/redis-6.2.5.tar.gz
wget -c http://iso.sqlfans.cn/redis/install_redis_625.sh
bash install_redis_625.sh /data 6379
#.登录测试
echo "info keyspace" | /usr/local/bin/redis-cli -a RbY9k2_NBf1QWy8I -c -p 6379 2>/dev/null
#.开始安装
cd /opt/
wget -c http://iso.sqlfans.cn/redis/redis-7.0.11.tar.gz
wget -c http://iso.sqlfans.cn/redis/install_redis_7011.sh
bash install_redis_7011.sh /data 6379
#.登陆测试
echo "info keyspace" | /usr/local/bin/redis-cli -a RbY9k2_NBf1QWy8I -c -p 6379 2>/dev/null
#.从5.0开始要求CPU必须支持AVX指令集,执行如下命令若无返回则表示不支持adx
cat /proc/cpuinfo | grep avx
#.开始安装
cd /opt
wget -c http://iso.sqlfans.cn/linux/numactl-2.0.12-5.el7.x86_64.rpm
wget -c http://iso.sqlfans.cn/linux/openssl-1.0.2k-26.el7_9.x86_64.rpm
wget -c http://iso.sqlfans.cn/mongodb/mongodb-linux-x86_64-rhel70-6.0.6.tgz
wget -c http://iso.sqlfans.cn/mongodb/mongosh-1.6.0-linux-x64.tgz
wget -c http://iso.sqlfans.cn/mongodb/install_mongodb_606.sh
bash install_mongodb_606.sh /data 3717
#.登陆测试
echo "db.system.users.find();" | /usr/local/mongodb/bin/mongosh -u dba_admin -p 1_yyJnwRD48CbSql --authenticationDatabase admin --host 127.0.0.1 --port 3717 admin
#.开始安装
cd /opt/
wget -c http://iso.sqlfans.cn/postgresql/postgresql-10.12-1-linux-x64-binaries.tar.gz
wget -c http://iso.sqlfans.cn/postgresql/install_pgsql_1012.sh
wget -c http://iso.sqlfans.cn/postgresql/my_pgsql.conf
bash install_pgsql_1012.sh /opt /data 1921
#.登陆测试
/opt/pgsql/bin/psql -h 127.0.0.1 -p 1921 -U postgres -d postgres -c "SELECT * FROM pg_shadow;"
#.开始安装
cd /opt/
wget -c http://iso.sqlfans.cn/oracle/p13390677_112040_Linux-x86-64_1of7.zip
wget -c http://iso.sqlfans.cn/oracle/p13390677_112040_Linux-x86-64_2of7.zip
wget -c http://iso.sqlfans.cn/oracle/install_oracle_11g.sh
bash install_oracle_11g.sh
#.登陆测试
su - oracle -c "sqlplus / as sysdba"
SQL> select * from v
$version
;
#.开始安装
mkdir -p /data/minio_9000/{data,logs}
curl -L http://iso.sqlfans.cn/linux/minio.2023-06-29 -o /data/minio_9000/minio
chmod +x /data/minio_9000/minio
export MINIO_ROOT_USER
=minioadmin
export MINIO_ROOT_PASSWORD
=Admin_147
nohup /data/minio_9000/minio server /data/minio_9000/data --console-address=
":9100" > /data/minio_9000/logs/minio.log 2>
&1 &
#.登录测试
地址:http://{ip}:9100
账号:minioadmin
密码:Admin_147
#.开始安装
curl -sL 'http://iso.sqlfans.cn/linux/install_elasticsearch_7101.sh' | bash
/data/elasticsearch_9200/bin/elasticsearch --version
#.登陆测试
curl http://127.0.0.1:9200/_cat/indices?v
目前,容器和 Docker 依旧是技术领域最热门的词语,无状态的服务容器化已经是大势所趋,同时也带来了一个热点问题被大家所争论不以:数据库 MySQL 是否需要容器化?
[TOC]
认真分析大家的各种观点,发现赞同者仅仅是从容器优势的角度来阐述 MySQL 需要容器化,几乎没有什么业务场景进行验证自己的观点;
反过来再看反对者,他们从性能、数据安全等多个因素进行阐述 MySQL不需要容器化,也举证了一些不适合的业务场景。
下面,我们就聊一下 Docker 不适合跑 MySQL 的 N 个原因!
不要将数据储存在容器中,这也是 Docker 官方容器使用技巧中的一条。容器随时可以停止、或者删除。当容器被rm掉,容器里的数据将会丢失。
为了避免数据丢失,用户可以使用数据卷挂载来存储数据。但是容器的 Volumes 设计是围绕 Union FS 镜像层提供持久存储,数据安全缺乏保证。如果容器突然崩溃,数据库未正常关闭,可能会损坏数据。另外,容器里共享数据卷组,对物理机硬件损伤也比较大。
大家都知道,MySQL 属于关系型数据库,对IO要求较高。当一台物理机跑多个时,IO就会累加,导致IO瓶颈,大大降低 MySQL 的读写性能。
在一次Docker应用的十大难点专场上,某国有银行的一位架构师也曾提出过:“数据库的性能瓶颈一般出现在IO上面,如果按 Docker 的思路,那么多个docker最终IO请求又会出现在存储上面。现在互联网的数据库多是share nothing的架构,可能这也是不考虑迁移到 Docker 的一个因素吧”。
其实也有相对应的一些策略来解决这个问题,比如:
1)数据库程序与数据分离
如果使用Docker 跑 MySQL,数据库程序与数据需要进行分离,将数据存放到共享存储,程序放到容器里。如果容器有异常或 MySQL 服务异常,自动启动一个全新的容器。
2)跑轻量级或分布式数据库
Docker 里部署轻量级或分布式数据库,Docker 本身就推荐服务挂掉,自动启动新容器,而不是继续重启容器服务。
3)合理布局应用
对于IO要求比较高的应用或者服务,将数据库部署在物理机或者KVM中比较合适。目前腾讯云的TDSQL和阿里的Oceanbase都是直接部署在物理机器,而非Docker 。
在 Docker 中水平伸缩只能用于无状态计算服务,而不是数据库。
Docker 快速扩展的一个重要特征就是无状态,具有数据状态的都不适合直接放在 Docker 里面,如果 Docker 中安装数据库,存储服务需要单独提供。
目前,腾讯云的TDSQL(金融分布式数据库)和阿里云的Oceanbase(分布式数据库系统)都直接运行中在物理机器上,并非使用便于管理的 Docker 上。
资源隔离方面,Docker 确实不如虚拟机KVM,Docker是利用Cgroup实现资源限制的,只能限制资源消耗的最大值,而不能隔绝其他程序占用自己的资源。如果其他应用过渡占用物理机资源,将会影响容器里 MySQL 的读写效率。
需要的隔离级别越多,获得的资源开销就越多。相比专用环境而言,容易水平伸缩是Docker的一大优势。然而在 Docker 中水平伸缩只能用于无状态计算服务,数据库并不适用。
MySQL 也不是全然不能容器化。以下几种场景还是适合的。
典型案例:同程旅游、京东、阿里的数据库容器化都是不错的案例,大家可以自行去查看。
Leanote 蚂蚁笔记是一款云笔记工具,蚂蚁笔记(又名LeaNote)就是一款国产开源的私有云笔记软件。它支持普通格式笔记、Markdown语法、专业数学公式编辑、和思维脑图,常见的笔记相关功能它都拥有,同时也支持 vim&emacs 输入,持私有本地部署。
1.本次实践部署环境为个人测试环境,生产环境请谨慎; 2.本次实践为快速使用docker部署开源Leanote蚂蚁笔记。
本次实践环境规划:
|
hostname
|
IP地址
|
Leanote镜像版本
|
操作系统版本
|
|---|---|---|---|
|
jeven
|
192.168.3.166
|
latest
|
centos 7.6
|
检查Docker版本
[root@jeven ~]
# docker version
Client: Docker Engine - Community
Version: 20.10.17
API version: 1.41
Go version: go1.17.11
Git commit: 100c701
Built: Mon Jun 6 23:05:12 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.17
API version: 1.41 (minimum version 1.12
)
Go version: go1.17.11
Git commit: a89b842
Built: Mon Jun 6 23:03:33 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.6
GitCommit: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc:
Version: 1.1.2
GitCommit: v1.1.2-0-ga916309
docker-init:
Version: 0.19.0
GitCommit: de40ad0
检查Docker服务状态,确保Docker服务正常运行。
[root@jeven ~]
# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2023-05-15 20:34:37 CST; 9h ago
Docs: https://docs.docker.com
Main PID: 10133 (dockerd)
Tasks: 25
Memory: 1.1G
本次使用Leanote容器镜像从dockerhub拉取,版本为latest版本。
[root@node ~]
# docker pull axboy/leanote
Using default tag: latest
latest: Pulling from axboy/leanote
23884877105a: Pull complete
bc38caa0f5b9: Pull complete
2910811b6c42: Pull complete
36505266dcc6: Pull complete
a4d269900d94: Pull complete
5e2526abb80a: Pull complete
d3eece1f39ec: Pull complete
358ed78d3204: Pull complete
1a878b8604ae: Pull complete
978c572f0440: Pull complete
35a600ffcf6a: Pull complete
fa9f812cdfe6: Pull complete
7a8109e27110: Pull complete
e7cb12a43d53: Pull complete
98477f6eb1fd: Pull complete
Digest: sha256:9542a462043c9d293e8eda12e1b48ada77ae411121583631c5fa94083a730ef5
Status: Downloaded newer image for axboy/leanote:latest
docker.io/axboy/leanote:latest
创建Leanote容器挂载的数据目录
[root@node ~]
# mkdir -p /data/leanote/{db,conf,files,upload}
[root@node ~]
# cd /data/leanote/
[root@node leanote]
#
使用docker-cli命令快速创建Leanote容器。
docker run -d -p 9800:9000 \
-e "TZ=Asia/Shanghai"
\
--restart
=always\
-v /data/leanote/db:/data/db \
-v /data/leanote/conf/:/data/leanote/conf \
-v /data/leanote/files:/data/leanote/files \
-v /data/leanote/upload:/data/leanote/public/upload \
-m 50M --oom-kill-disable --memory-swap=-1\
--name leanote \
axboy/leanote

检查Leanote容器状态状态
[root@node leanote]
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
587ff7c0b1c7 axboy/leanote "docker-entrypoint.s…" 18 seconds ago Up 14 seconds 27017/tcp, 0.0.0.0:9800->
9000/tcp, :::9800->
9000/tcp leanote
检查Leanote容器所在系统资源。
[root@node leanote]
# docker stats --no-stream leanote
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
587ff7c0b1c7 leanote 0.30% 31.5MiB / 50MiB 63.01% 656B / 0B 541MB / 904MB 43
直接访问:http://192.168.3.166:9800/ 进入Leanote首页

选择语言为简体中文

user1 username: admin, password: abc123 (管理员, 只有该用户才有权管理后台, 请及时修改密码)user2 username: demo@leanote.com, password: demo@leanote.com (仅供体验使用)



进入Leanote蚂蚁笔记的后台管理


将个人笔记设置为公开博客

选择“我的博客”功能模块,进入个人博客页面。



选择博客设置,进入博客管理页面。


在博客管理页面,选择个人喜欢的主题。



ZeroTiger是一个国外的服务商所提供的基于P2P的组网方案,它可以通过软件的形式实现将我们需要组网的设备加入到一个虚拟的局域网中,从而实现数据的交换。
组网逻辑:
1.组网设备接入Zerotier,并通过ID加入指定的虚拟网络。
2.当设备之间发生数据交换时,网络调度设备间尝试P2P直连。
3.失败时,从网络中寻找moon服务器作为中转。
我们使用自己的云服务自建Moon服务器加入Zerotier网络,当P2P失败时,数据始终通过我们自建的私有根服务器作为中转。私有网络需要认证才可以加入,具有一定的安全性。
依然使用我们的老伙计docker来实现,创建很简单,一条命令创建即可。
docker run --restart=on-failure:3 -d --name ztncui -e HTTP_PORT=4000 -e HTTP_ALL_INTERFACES=yes -e ZTNCUI_PASSWD=admin@123 -p 4000:4000 keynetworks/ztncui

前面也介绍过了,使用Zerotier在一定程度上是可以P2P打洞成功的,不成功的时候就可以使用我们的Moon服务器来进行中转,保证完成组网。此服务需要占用tcp及udp的9993端口
# 创建一个持久化存放文件的目录
mkdir -p /opt/docker/moon
# 获得云服务器的公网ip
public_ip=`curl ip.sb`
# 建立moon服务器
docker run --name zerotier-moon -d -p 9993:9993 -p 9993:9993/udp -v /opt/docker/moon:/var/lib/zerotier-one jonnyan404/zerotier-moon -4 $public_ip

到此我们的服务端就搭建好了。查看一下日志,记录一下moon id,后面加入会用到。
docker logs -f zerotier-moon

使用我们云服务器http:// ip:4000访问,ip为云服务器的公网ip,打开配置页。

点击右上角的login登录。

使用默认用户名和密码登录: admin/admin@123,登录完成后根据提示修改密码。

设置完成后,切换到Add network选项卡,任意为网络起一个名字。

点击Create Network

这样我们的网络就设置好了,请记录创建好的网络id。

回到上一级页面,最后在network上,设置网段,可以点击自动生成,然后提交。


为了方便演示不同平台,我这里以一台Linux和一台Windows为例子演示组网过程。
首先到官方网站上下载Windows客户端:
https://www.zerotier.com/download/
安装很简单,下一步即可。完成后,在开始菜单中可以找到安装的ZeroTier软件,右下角会多出图标,打开面板。把之前记下的网络填入下方,点击Join Network。

回到网页上授权,并定义一个友好的名字,方便辨认。

客户端上,状态显示成功时,表示搭建成功。

最后在配置一下加入moon服务器,打开cmd。
cd C:\ProgramData\ZeroTier\One
zerotier-cli orbit [moon_id] [moon_id]
将之前记录的moon id填进去后执行。

查看是否加入monn节点:
zerotier-cli listpeers
可以看到其中包含我们自建moon服务器的公网ip地址。

拉取镜像:
docker pull bltavares/zerotier
配置镜像:
docker run -d --device=/dev/net/tun \
--name zerotier-one \
--net=host \
--restart=always \
--cap-add=NET_ADMIN \
--cap-add=SYS_ADMIN \
-v /var/lib/zerotier-one:/var/lib/zerotier-one \
bltavares/zerotier:latest

加入zerotier网络
docker exec zerotier-one zerotier-cli join [网络ID]

显示 200 join ok 即添加成功。同样的需要在网页上去授权此节点。可以看到已经有虚拟ip生成,可以测试下两台主机之间的联通性。

发现已经可以使用p2p建立虚拟网络了,一台四川的服务器和一台北京的阿里云服务器,延迟大概40ms左右,效果还是很不错的。

最后再加入moon服务器,同样的需要把moon_ID的值修改为自建moon服务器的id。
#加入moon服务器
docker exec zerotier-one zerotier-cli orbit [moon_ID] [moon_ID]
#确认是否加入
docker exec zerotier-one zerotier-cli listpeers

至此~
在Linux操作系统中删除网络接口的命令是ifconfig或ip命令。下面将详细说明如何使用这两个命令来删除Linux网卡。
使用ifconfig命令删除网卡:
ifconfig命令,查看当前系统中的网卡接口列表,确认要删除的网卡接口的名称,一般以eth或enp开头。 sudo ifconfig down # 关闭网卡接口 sudo ifconfig del # 删除网卡接口 “
请将“替换为要删除的网卡接口的名称。使用ip命令删除网卡:
ip link show命令,查看当前系统中的网卡接口列表,确认要删除的网卡接口的名称,一般以eth或enp开头。 sudo ip link set down # 关闭网卡接口 sudo ip link delete # 删除网卡接口 “
请将“替换为要删除的网卡接口的名称。需要注意的是,删除网卡接口后将无法使用该接口进行网络连接。请确保在执行删除操作之前备份重要数据,并确保不会影响系统的正常运行。
此外,还可以通过编辑/etc/network/interfaces文件或/etc/sysconfig/network-scripts/ifcfg-文件来删除网卡接口的配置信息,但这种操作比较复杂,需要对网络配置文件有一定的了解。强烈建议在进行此类操作之前备份相关配置文件,以防止意外数据丢失。
下面讲解一下,如何使用 rpm 命令对 RPM 二进制包进行安装、卸载和升级操作。我们以安装 apache 程序为例。
通常情况下,RPM 包采用系统默认的安装路径,所有安装文件会按照类别分散安装到下表所示的目录中。
| 安装路径 | 含 义 |
|---|---|
| /etc/ | 配置文件安装目录 |
| /usr/bin/ | 可执行的命令安装目录 |
| /usr/lib/ | 程序所使用的函数库保存位置 |
| /usr/share/doc/ | 基本的软件使用手册保存位置 |
| /usr/share/man/ | 帮助文件保存位置 |
RPM 包的默认安装路径是可以通过命令查询的。
除此之外,RPM 包也支持手动指定安装路径,但此方式并不推荐。因为一旦手动指定安装路径,所有的安装文件会集中安装到指定位置,且系统中用来查询安装路径的命令也无法使用(需要进行手工配置才能被系统识别),得不偿失。
与 RPM 包不同,源码包的安装通常采用手动指定安装路径(习惯安装到 /usr/local/ 中)的方式。既然安装路径不同,同一 apache 程序的源码包和 RPM 包就可以安装到一台 Linux 服务器上(但同一时间只能开启一个,因为它们需要占用同一个 80 端口)。
实际情况中,一台服务器几乎不会同时包含两个 apache 程序,管理员不好管理,还会占用过多的服务器磁盘空间。
安装 RPM 的命令格式为:
[root@localhost ~]# rpm -ivh 包全名
注意一定是包全名。涉及到包全名的命令,一定要注意路径,可能软件包在光盘中,因此需提前做好设备的挂载工作。
此命令中各选项参数的含义为:
例如,使用此命令安装 apache 软件包,如下所示:
注意,直到出现两个 100% 才是真正的安装成功,第一个 100% 仅表示完成了安装准备工作。
此命令还可以一次性安装多个软件包,仅需将包全名用空格分开即可,如下所示:
[root@localhost ~]# rpm -ivh a
.rpm b
.rpm c
.rpm
如果还有其他安装要求(比如强制安装某软件而不管它是否有依赖性),可以通过以下选项进行调整:
apache 服务安装完成后,可以尝试启动:
[root@localhost ~]# service 服务名 start|stop|restart|status
各参数含义:
例如:
[root@localhost ~]# service httpd start #启动apache服务
服务启动后,可以查看端口号 80 是否出现。命令如下:
使用如下命令即可实现 RPM 包的升级:
[root@localhost ~]# rpm -Uvh 包全名
-U(大写)选项的含义是:如果该软件没安装过则直接安装;若已经安装则升级至最新版本。
[root@localhost ~]# rpm -Fvh 包全名
-F(大写)选项的含义是:如果该软件没有安装,则不会安装,必须安装有较低版本才能升级。
RPM 软件包的卸载要考虑包之间的依赖性。例如,我们先安装的 httpd 软件包,后安装 httpd 的功能模块 mod_ssl 包,那么在卸载时,就必须先卸载 mod_ssl,然后卸载 httpd,否则会报错。
软件包卸载和拆除大楼是一样的,本来先盖的 2 楼,后盖的 3 楼,那么拆楼时一定要先拆除 3 楼。
如果卸载 RPM 软件不考虑依赖性,执行卸载命令会包依赖性错误,例如:
RPM 软件包的卸载很简单,使用如下命令即可:
[root@localhost ~]# rpm -e 包名
-e 选项表示卸载,也就是 erase 的首字母。
RPM 软件包的卸载命令支持使用“-nocteps”选项,即可以不检测依赖性直接卸载,但此方式不推荐大家使用,因为此操作很可能导致其他软件也无法征程使用。
正则表达式中常用的模式修正符有i、g、m、s、U、x、a、D、e 等。它们之间可以组合搭配使用。
| 修饰符 | 含义 | 描述 |
|---|---|---|
| i | ignore – 不区分大小写 | 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。 |
| g | global – 全局匹配 | 查找所有的匹配项。 |
| m | more – 多行匹配 | 使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。 |
| s | 特殊字符圆点 . 中包含换行符 \n | 默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。 |
i 不区分(ignore)大小写
例如: /abc/i 可以匹配 abc、aBC、Abc
g 全局(global)匹配
如果不带g,正则过程中字符串从左到右匹配,找到第一个符合条件的即匹配成功,返回
如果带g,则字符串从左到右,找到每个符合条件的都记录下来,知道字符串结尾位置
例如:
var str = ‘aaaaaaaa’
var reg1 = /a/; str.match(reg1) // 结果为:[“a”, index: 0, input: “aaaaaaaa”]
var reg2 = /a/g; str.match(reg2) // 结果为:[“a”, “a”, “a”, “a”, “a”, “a”, “a”, “a”]
m 多(more)行匹配
若存在换行\n并且有开始^或结束$符的情况下,和g一起使用实现全局匹配,
因为存在换行时默认会把换行符作为一个字符任务匹配字符串是个单行,
g只匹配第一行,添加m之后实现多行,每个换行符之后就是开始
var str = “abcggab\nabcoab”;
var preg1 = /^abc/gm; str.match(preg1) // 结果为:[“abc”, “abc”]
var preg2 = /ab$/gm; str.match(preg2) // 结果为:[“ab”, “ab”]
s 特殊字符圆点 . 中包含换行符
默认的圆点 . 是 匹配除换行符 \n 之外的任何单字符,加上s之后, . 中包含换行符
$str = “abggab\nacbs”;
$preg = “/b./s”;
preg_match_all($preg, $str,$matchs);
print_r($matchs);//Array ( [0] => Array ( [0] => bg [1] => b [2] => bs ) )
U 只匹配最近的一个字符串;不重复匹配;
$mode=”/a(.*?)c/”;
$preg=”/a.*c/U”;//这两个正则返回相同的值
$str=”abcabbbcabbbbbc” ;
preg_match($mode,$str,$content); echo $content[0];//abc
preg_match($preg,$str,$content); echo $content[0];//abc
修正符:x 将模式中的空白忽略; 修正符:A 强制从目标字符串开头匹配; 修正符:D 如果使用$限制结尾字符,则不允许结尾有换行; 修正符:e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;