一.PXC简介:

galera产品是以galera cluster方式为mysql提高高可用集群解决方案的。galera cluster就是集成了galera插件的mysql集群。galera replication是codership提供的mysql数据同步方案,具有高可用性,方便扩展,并且可以实现多个mysql节点间的数据同步复制与读写,可保障数据库的服务高可用及数据强一致性。

PXC属于一套近乎完美的mysql高可用集群解决方案,相比那些比较传统的基于主从复制模式的集群架构MHA和MM+keepalived,galera cluster最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。本身galera cluster也是一种多主架构。galera cluster最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证MySQL集群的数据一致性;
对galera cluster的封装有两个,虽然名称不同,但实质都是一样的,使用的都是galera cluster。一个MySQL的创始人在自己全新的MariaDB上实现的MAriaDB cluster;一个是著名的MySQL服务和工具提供商percona实现的percona xtradb cluster,简称PXC

要搭建PXC架构至少需要3个mysql实例来组成一个集群,三个实例之间不是主从模式,而是各自为主,所以三者是对等关系,不分从属,这就叫multi-master架构。客户端写入和读取数据时,连接哪个实例都是一样的。读取到的数据时相同的,写入任意一个实例之后,集群自己会将新写入的数据同步到其他实例上,这种架构不共享任何数据,是一种高冗余架构。

-PXC原理:

PXC最常使用以下4个端口号:
3306-数据库对外服务的端口号。
4444-请求SST的端口(SST是指数据库一个备份全量文件的传输。)
4567-组成员之间进行沟通的一个端口号
4568-用于传输IST(相对于SST来说的一个增量)

PXC的操作流程:

首先客户端先发起一个事务,该事务先在本地执行,执行完成之后就要发起对事务的提交操作了。在提交之前需要将产生的复制写集广播出去,然后获取到一个全局的事务ID号,一并传送到另一个节点上面。通过合并数据之后,发现没有冲突数据,执行apply_cd和commit_cb动作,否则就需要取消此次事务的操作。而当前server节点通过验证之后,执行提交操作,并返回OK,如果验证没通过,则执行回滚。当然在生产中至少要有3个节点的集群环境,如果其中一个节点没有验证通过,出现了数据冲突,那么此时采取的方式就是讲出现不一致的节点踢出集群环境,而且它自己会执行shutdown命令,自动关机。

二.环境简介
系统:RHEL7.4(3.10.0-693.el7.x86_64)
软件:Percona-XtraDB-Cluster-57
节点:node1:192.168.4.1 node2:192.168.4.2 node3:192.168.4.3
参考资料:Percona XtraDB Cluster Documentation Release 5.7.25-31.35
安装PXC过程中:
iptables 禁掉; selinux 禁掉

node1:网络源并且封装成本地yum
官网下载Percona XtraDB Cluster
1.yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
2.yum -y install
http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/x86_64/RPMS.classic
//libev4-4.24-alt1.x86_64.rpm
3.yum install Percona-XtraDB-Cluster-57

制作本地yum
1.node1开启下载缓存 vim /etc/yum.conf (keepcache=1)
2.yum -y install vsftpd && systemctl start vsftpd
3. mkdir /var/ftp/my_yum
4.find /var/cache/yum/x86_64/7Server/ -iname “*.rpm” -exec cp -rp {} /var/ftp/my_yum ;
5. cd /var/ftp/my_yum && yum -y install createrepo
6. node2 和 node3 使用ftp访问
[my_num]
name=my_num
baseurl=ftp://192.168.4.1/my_yum
enabled=1
gpgcheck=0
7.node2 node3 :yum -y install Percona-XtraDB-Cluster-57

更改PXC配置文件
1.创建自定义目录(3个node均需操作)
mkdir -p /data/local/percona-xtradb-cluster/data
chown -R mysql:mysql /data/local/percona-xtradb-cluster/data
mkdir -p /data/local/percona-xtradb-cluster/run
chown -R mysql:mysql /data/local/percona-xtradb-cluster/run
mkdir -p /data/logs/mysql
chown -R mysql:mysql /data/logs/mysql
touch /data/logs/mysql/error.log
chown -R mysql:mysql /data/logs/mysql/error.log

2.node1更改配置文件(默认/etc/my.cnf文件删除,写入以下文件,也可以重新指定路径)
[client] 客户端
port = 3306
socket = /data/local/percona-xtradb-cluster/run/mysql.sock
default-character-set = utf8mb4 (升级的utf8)
[mysqld]
user = mysql
innodb_buffer_pool_size = 1024M
character_set_server = utf8mb4
datadir = /data/local/percona-xtradb-cluster/data
port = 3306
server_id = 1
socket = /data/local/percona-xtradb-cluster/run/mysql.sock
pid-file = /data/local/percona-xtradb-cluster/run/mysql.pid
log-error = /data/logs/mysql/error.log
log_warnings = 2
slow_query_log_file = /data/logs/mysql/slow.log
long_query_time = 2
log_timestamps=SYSTEM
lower_case_table_names = 1
key_buffer_size = 1344M
event_scheduler=ON
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
wsrep_provider=/usr/lib64/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.4.1,192.168.4.2,192.168.4.3
binlog_format=ROW
pxc_strict_mode=ENFORCING (严格保证数据强一致性)
max_connect_errors=1000
max_allowed_packet = 1024M
default_storage_engine=InnoDB
#Innodb
innodb_flush_method = O_DIRECT
innodb_log_files_in_group = 5
innodb_lock_wait_timeout = 50
innodb_log_file_size = 1024M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1
innodb_thread_concurrency = 8 (引擎并发连接数量; cpu的1.5倍)
innodb_buffer_pool_size = 5G
innodb_read_io_threads = 24 (读io数量)
innodb_write_io_threads = 24 (写io数量)
log_bin_trust_function_creators=1
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1

CACHES AND LIMITS

tmp_table_size = 32M
max_heap_table_size = 32M
max_connections = 1000 (根据在线人数设置最大连接数)
thread_cache_size = 50
open_files_limit = 65535
table_definition_cache = 4096
table_open_cache = 5000
#wsrep
wsrep_retry_autocommit=1
wsrep_auto_increment_control=1
wsrep_node_name = pxc-linux-1
wsrep_node_address=192.168.4.1
wsrep_sst_method=xtrabackup-v2 (全量备份方法)
wsrep_cluster_name=test-pxc (集群名称)
wsrep_sst_auth=“sync_rep:abc123” (sst备份用的用户:密码)

cp配置文件到node2 node3 更新上图蓝色字体

3.启动pxc
主节点node1: systemctl start mysql@bootstrap.service(wsrep_cluster初始化)
ss -anlptu | grep :3306 ss -anlptu | grep :4567
node2 node3:systemctl start mysql && systemctl disable mysql
4.修改初始密码:grep password /data/logs/mysql/error.log
登陆任一mysql后查看:mysql> show status like ‘wsrep%’;
mysql> show status like ‘wsrep%’;
±---------------------------------±---------------------------------------------------+
| Variable_name | Value |
±---------------------------------±---------------------------------------------------+
| wsrep_local_state_uuid | c4da6863-8060-11e9-86d8-b39583c388a0
| wsrep_protocol_version | 9 |
| wsrep_last_applied | 22 #同步应用次数 |
| wsrep_last_committed | 22 #事务提交次数(各节点应该相等,若不是则事务有延迟 |
| wsrep_replicated | 6 #被其他节点复制的总数
| wsrep_replicated_bytes | 1688 #参考负载 越大越忙 |
| wsrep_repl_keys | 19 |
| wsrep_repl_keys_bytes | 296 |
| wsrep_repl_data_bytes | 989 |
| wsrep_repl_other_bytes | 0 |
| wsrep_received | 11 #从其他节点处收到的写入请求总数 |
| wsrep_received_bytes | 2838 |
| wsrep_local_commits | 4 |
| wsrep_local_cert_failures | 0 |
| wsrep_local_replays | 0 |
| wsrep_local_send_queue | 0 #发送队列的长度 >0 表示被节流 |
| wsrep_local_send_queue_max | 1 |
| wsrep_local_send_queue_min | 0 |
| wsrep_local_send_queue_avg | 0.000000 #发送队列的平均长度 |
| wsrep_local_recv_queue | 0 #接收队列的长度 |
| wsrep_local_recv_queue_max | 1 |
| wsrep_local_recv_queue_min | 0 |
| wsrep_local_recv_queue_avg | 0.000000 #接收队列的平均长度 |
| wsrep_local_cached_downto | 8 |
| wsrep_flow_control_paused_ns | 0 #流控暂停状态下话费的总时间(ns) |
| wsrep_flow_control_paused | 0.000000 #流量控制暂停时间的占比(0-1) |
| wsrep_flow_control_sent | 0 #发送的流控暂停时间的数量 |
| wsrep_flow_control_recv | 0 #接收的流控暂停时间的数量 |
| wsrep_flow_control_interval | [ 173, 173 ] #流量控制的上限和下限 |
| wsrep_flow_control_interval_low | 173 |
| wsrep_flow_control_interval_high | 173 |
| wsrep_flow_control_status | OFF #流量控制状态 |
| wsrep_cert_deps_distance | 1.666667 |
| wsrep_apply_oooe | 0.000000 #队列中事务并发执行占比,值越高意味着效率越高 |
| wsrep_apply_oool | 0.000000 |
| wsrep_apply_window | 1.000000 #平均并发提交窗口大小 |
| wsrep_commit_oooe | 0.000000 |
| wsrep_commit_oool | 0.000000 |
| wsrep_commit_window | 1.000000 |
| wsrep_local_state | 4 #节点状态 |
| wsrep_local_state_comment | Synced #节点正常提供服务的状态 |
| wsrep_cert_index_size | 24 |
| wsrep_cert_bucket_count | 58 |
| wsrep_gcache_pool_size | 6152 |
| wsrep_causal_reads | 0 |
| wsrep_cert_interval | 0.000000 |
| wsrep_open_transactions | 0 |
| wsrep_open_connections | 0 |
| wsrep_ist_receive_status | |
| wsrep_ist_receive_seqno_start | 0 |
| wsrep_ist_receive_seqno_current | 0 |
| wsrep_ist_receive_seqno_end | 0 |
| wsrep_incoming_addresses | 192.168.4.1:3306,192.168.4.3:3306,192.168.4.2:3306 |
| wsrep_cluster_weight | 3 |
| wsrep_desync_count | 0 |
| wsrep_evs_delayed | |
| wsrep_evs_evict_list | |
| wsrep_evs_repl_latency | 0/0/0/0/0 |
| wsrep_evs_state | OPERATIONAL |
| wsrep_gcomm_uuid | ef92a828-806e-11e9-a77a-0386c78c936d |
| wsrep_cluster_conf_id | 33 #集群节点关系改变的次数(每次增加/删除都会+1) |
| wsrep_cluster_size | 3 #集群节点个数 |
| wsrep_cluster_state_uuid | c4da6863-8060-11e9-86d8-b39583c388a0 |
| wsrep_cluster_status | Primary #集群状态PRIMARY(正常)/NON_PRIMARY(不一致) |
| wsrep_connected | ON #节点是否连接到集群,取值:ON/OFF |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_index | 2 #节点id,取值从0开始 |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy info@codership.com |
| wsrep_provider_version | 3.35(rddf9876) |
| wsrep_ready | ON |
±---------------------------------±---------------------------------------------------+
71 rows in set (0.00 sec)

http://galeracluster.com/documentation-webpages/galerastatusvariables.html?highlight=wsrep_local_index#wsrep-local-index 参考详细状态信息

5.pxc测试
任一node:(试验node2)
mysql> create table t1(id int primary key auto_increment, num int);
Query OK, 0 rows affected (1.13 sec)
mysql> insert into t1(num) values(18),(20);
Query OK, 2 rows affected (0.32 sec)
Records: 2 Duplicates: 0 Warnings: 0

登陆node1 node3 查看数库
mysql> select * from t1;
±—±-----+
| id | num |
±—±-----+
| 2 | 18 |
| 5 | 20 |
±—±-----+
2 rows in set (0.00 sec)

停止node1的mysql服务,其他节点查看集群状态并写入数据
重新开启node1服务,可以查看更新的数据
node2:
mysql> create table t2(id int primary key auto_increment,name char(5));
mysql> insert into t6(name) values (“mary”),(“tom”);

Node1:
mysql> select * from t2;
±—±-----+
| id | name |
±—±-----+
| 1 | mary |
| 2 | tom |
±—±-----+
2 rows in set (0.00 sec)

总结:
1.PXC的优点:

①:实现mysql数据库集群架构的高可用性和数据的强一致性。
②:完成了真正的多节点读写的集群方案。
③:改善了传统意义上的主从复制延迟问题,基本上达到了实时同步。
④:新加入的节点可以自动部署,无须提供手动备份,维护起来很方便。
⑤:由于是多节点写入,所以数据库故障切换很容易。

2.PXC的缺点:
①:新加入的节点开销大,需要复制完整的数据。采用SST传输开销太大。
②:任何更新事务都需要全局验证通过,才会在每个节点库上执行。集群性能受限于性能最差的节点,也就是经常说的短板效应。
③:因为需要保证数据的一致性,所以在多节点并发写时,锁冲突问题比较严重。
④:存在写扩大问题,所有的节点上都会发生些操作。
⑤:只支持innodb存储引擎的表。
⑥:没有表级别的锁定,执行DDL语句操作会把整个集群锁住,而且也 kill 不了(建议使用Osc操作,即在线DDL)
⑦:所有的表必须含有主键,不然操作数据时会报错。

3.PXC搭建的注意点:

首先要规范集群中节点的数量,整个集群中节点数控制在最少3个、最多8个范围内。最少3个节点是为了防止出现脑裂现象,因为只有在两个节点下才会出现此现象。脑裂现象的标志就是输入任何命令、返回结果都是unkown command,节点在集群中,会因为新节点的加入或者故障,同步失效等而发生状态的切换。

–节点状态变化阶段:
节点的状态,取值1-6。
取值1:The node starts and establishes a connection to the Primary Component.
取值2:When the node succeeds with a state transfer request, it begins to cache write-sets.
取值3:The node receives a State Snapshot Transfer. It now has all cluster data and begins to apply the cached write-sets.
Here the node enables Flow Control to ensure an eventual decrease in the slave queue.
取值4:The node finishes catching up with the cluster. Its slave queue is now empty and it enables Flow Control to keep it empty.
The node sets the MySQL status variable wsrep_ready to the value 1. The node is now allowed to process transactions.
取值5:The node receives a state transfer request. Flow Control relaxes to DONOR. The node caches all write-sets it cannot apply.
取值6:The node completes the state transfer to joiner node.

open:节点启动成功,尝试连接到集群。
primary:节点已处于集群中,在新节点加入时,选取donor进行数据同步时会产生的状态。
joiner:节点处于等待接收同步文件时的状态。
joined:节点完成数据同步的工作,尝试保持和集群进度一致。
synced:节点正常提供服务的状态,表示已经同步完成并和集群进度保持一致。
doner:节点处于为新加入的节点提供全量数据时的状态。

注意:doner节点就是数据的贡献者,如果一个新节点加入集群,此时又需要大量数据的SST传输,就有可能因此而拖垮整个集群的性能。所以在生产环境中,如果数据量小,还可以使用SST全量传输,但如果数据量很大就不建议使用这种方式了。可以考虑先建立主从关系,在加入集群。

PXC有两种节点的数据传输方式:一种叫SST全量传输,另一种叫IST增量传输。

SST传输有:xtrabackup、mysqldump和rsync三种方法。而增量传输就一种方法就是xtrabackup。但生产环境中一般数据量不大的时候,可以使用SST全量传输,但也只实现xtrabackup方法。

在PXC中还有一个特别重要的模块就是GCache。它的核心功能就是每个节点缓存当前最新的写集。如果有新节点加入进来,就可以把新数据的增量传递给新节点,而不需要再使用SST方式了。这样可以让节点更快地加入集群中。涉及参数如下:

gcache.size:代表用来缓存写集增量信息的大小。它的默认大小是128MB,通过wsrep_provider_options参数设置。建议调整为2GB-4GB范围,足够的空间便于缓存更多的增量信息。

gcache.mem_size:代表gcache中内存缓存的大小,适度调大可以提高整个集群的性能。

gcache.page_size:可以理解为如果内存不够用(gcache不足),就直接将写集写入磁盘文件中。

5:PXC的工作模式:

galera的工作模式是——某个节点写入一个事务,它会广播到其他节点,而这个所谓的其他节点,也包括自己。也就说自己发出来的事务,自己也会收到,只是在收到并产生GTID之后,就被简单忽略了,而不会再去apply一次。

–:galera的并发控制机制:
并发控制主要是在接口galera_pre_commit中完成的,这个接口是galera最重要的接口之一,这里面实现了最重要的复制、验证逻辑。目前,这个接口中包括的并发控制有以下几点:

①:数据复制:

目前的galera版本中,写集数据的发送是通过asio的异步方式将数据广播出去。这个发送是串行的,是一个临界区,因为在每次 发送前,逻辑上还需要分片,并且每次发送完成之后,需要等待一个GTID的值,所以为了保证数据的一致性,这个发送操作需要串行;

②:写集验证:

要求所有进入处理区的GTID必须是顺序的,因为GTID是顺序产生的,所以在顺序的基础上,同一时间必须只有一个事务可以进行处理,说白了就是串行;

受这种层次并发控制管理的操作主要有验证操作,因此说验证是串行的;

③:写集apply

④:事务commit

这个层次的并发控制机制,默认是3,建议也是3,就是串行提交,这样就保证了不管在主库还是从库,所有的节点产生的binlog都是完全相同的;

3、galera 接口:

—galera_init:
这个接口的作用是初始化一个galera节点,这是一个PXC节点调用的第一个wsrep接口,在启动服务器的时候初始化,将所有需要的参数和环境变量初始化。(如:集群名字,实例地址、需要这个接口做binlog的复制等)

—galera_connect:

这个接口是第二个调用的接口。这个接口的作用是将当前节点加入集群中。加入集群前会调用函数wsrep_view_handler_cb来判断新加入节点与集群的数据是否同步;

—galera_recv:
这个接口的作用是,在这个函数里阻塞式的接收其他节点及本节点发送的数据,并且调用复制apply函数执行复制操作。(这个接口实际上是可以并行存在的。它对应的是参数wsrep_slave_threads有多少个线程,就有多少个galera_recv的调用)

—galera_pre_commit:

这个接口是galera最重要的接口之一。它的作用包括两部分,首先是将当前指定的事务写集广播给整个集群节点,然后就是验证,如果验证成功,则将处理权交给上层,继续做数据库事务的提交操作;这个接口是在数据库事务提交时调用的,调用这个接口时,必须是本地事务已经执行完成;

—galera_replay_trx:

这个接口的作用及使用,就是在验证过程中,由于数据库锁的冲突,当前操作被其他线程自治县了galera_abort_pre_com_mit,导致当前线程被强制中止,但是由于写集已经复制到其他节点,所以本节点这个事务必须要完成。通过这个接口,将这个事务的写集做一次apply,所以就叫replay;
—galera_append_key:

这个接口就是所谓的galera验证,被验证的对象实际上就是写集,而构成写集的内容,其实就是通过这个接口来完成的;

—galera_append_data:

这个接口是当前事务所生成的binlog内容,也就是说key在验证通过之后,使用data在从节点执行,即可做到数据同步;

—galera_post_commit:

这个接口是用来真正提交事务的。这个接口包括4个功能:更新状态参数wsrep_last_committed的值,表示当前事务已经真正提交了;更新参数wsrep_local_commits的值,表示本地又成功提交了一个事务;检查当前验证写集缓冲区是不是可以做purge操作;

—galera_to_execute_start:

这个接口专门用来处理DDL语句的执行;

—galera_to_execute_end:

这个接口实际上和galera_post_commit功能一样,成对出现,是为处理不同语句而设置的,主要就是为了从commit临界区中出来,从而让其他事务继续提交;

补充参考:https://www.cnblogs.com/zengkefu/p/5678279.html

pxc部署和配置详解相关推荐

  1. 1 企业实战(3) Redis服务部署和配置详解 (资源)

    前言: 环境介绍: CentOS 7.5 Redis 5.0.0 gcc 下载: http://download.redis.io/releases/ 安装redis: [root@localhost ...

  2. Kafka 环境部署与配置详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是Kafka Kafka是一种高吞吐量 的分布式发布订阅消息系统,有如下特性:1>.通过O(1)的磁盘数据结构提供消 ...

  3. haproxy安装部署以及配置详解

    haproxy安装部署 一. Haproxy简介 haproxy提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. ha ...

  4. linux下nginx部署以及配置详解

    1.下载源码包解压编译 启动多个,请看:在linux系统下安装两个nginx以及启动 查看nginx包路径:http://nginx.org/download/,两种下载方式: 1.在官网下载使用Xf ...

  5. asp.net 获取计算机配置_PBI Report Server 部署与配置详解

    12月18日追加:欢迎加入知乎-微软BI技术圈,一起讨论.分享包括PowerBI在内的一切BI话题! [前述]关于Power BI 报表服务器的安装与配置,国内外的教程有很多,但较为全面的介绍却少之又 ...

  6. Twemproxy的部署和配置详解

    Twemproxy 概述 Twemproxy(又称为nutcracker)是一个轻量级的Redis和Memcached代理,主要用来减少对后端缓存服务器的连接数.Twemproxy是由Twitter开 ...

  7. Zabbix监控系统部署:配置详解

    1. 全局配置 ListenPort ,监听端口 ,取值范围为1024-32767,默认端口10051 SourceIP,外发连接源地址 LogType,日志类型:单独日志文件,系统文件,控制台输出 ...

  8. redis服务部署及配置详解

    Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集合和有序集合.支持在服务器端计算集合的并,交和补集(diffe ...

  9. linux nginx权限配置文件,linux下nginx部署以及配置详解

    1.下载源码包解压编译 1.在官网下载使用Xftp上传到linux上(不推荐使用) 2.(推荐)在版本上选好,直接命令下载,如下:(下载nginx-1.16.1.tar.gz版本)建议到home目录执 ...

  10. dellr420部署os_戴尔dell poweredge r730服务器系统安装配置详解教程

    第一次给服务器安装的是ubantu系统: 首先我们开机进入小型BIOS设置一下RAID,或者进入服务器管理系统,在系统的BIOS中进行RAID设置: 开机后当看到出现< Ctrl > 时按 ...

最新文章

  1. UbuntuでPostgreSQLをインストールからリモートアクセスまでの手順
  2. textarea 转换 html,textarea html标签转换为纯文本
  3. python字典下标是什么_python列表、元组、字典
  4. Python持续更新的新特性
  5. Linux awk 命令
  6. luogu P1659 [国家集训队]拉拉队排练
  7. partial is not defined的解决办法
  8. 利用Matlab寻找曲线的拐点
  9. python 数据类笔试题_数据分析岗Python笔试题
  10. 硬盘数据恢复软件FinalData使用心得
  11. pyqtgraph中文文档
  12. 物联网中使用了哪些技术?
  13. AGS量化自动炒币机器人与同类软件对比
  14. python保存图片格式_python 存储网页图片格式
  15. Auto CAD标注表面粗糙度的方法
  16. 如何在 Ubuntu 20.04 上安装 Wine 6.0
  17. 全国天气预报信息数据 API
  18. 数据结构知识梳理笔记
  19. C语言----结构体及其应用
  20. Ubuntu下显卡超频方式

热门文章

  1. Excel怎么忽略位置对比两列数据是否相同
  2. 设备\Device\Harddisk1\DR1 有一个不对的区块
  3. flame linux mac,Autodesk版蓝宝石插件 GenArts Sapphire V10.0 (Mac/Linux)
  4. 这是一个价值一个亿的项目思维导图
  5. 微信小程序java后端_微信小程序访问后端服务器-微信小程序后端-微信小程序后端JAVA...
  6. H5/web前端工程简历中的项目经验
  7. 中兴c600olt数据配置_中兴OLT业务配置
  8. xodo pdf android,手机上最好用的pdf阅读器,没有之一——【Xodo】
  9. Windows 域之 LDAP与AD
  10. 百度近期开始大规模清理不良P2P网贷平台