文章目录
一、分布式理论
CAP定理
来源:https://zh.wikipedia.org/wiki/CAP定理
在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
-
一致性(Consistency):等同于所有节点访问同一份最新的数据副本。
-
可用性(Availability):每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据。
-
分区容错性(Partitiontolerance):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择[3]。
根据定理,分布式系统只能满足三项中的两项而不可能满足全部三项[4]。理解CAP理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。
BASE理论
-
基本可用(Basically Available):基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。例如:电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。
-
软状态( Soft State):软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。
-
最终一致性( Eventual Consistency):最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。
数据模型
1.BigTable
2.Dynamo
二、cassandra体系结构
1、体系结构
关键组成部分:
- node:
- cluster
- Datacenter
- replication
- commit log
- SSTable
- tombstone /'tuːmstəʊn/
- CQL Table
- Gossip
- Partitioner 集群中的节点之间均匀分配数据以实现负载平衡。
- replication factor
2、存储引擎
cassandra是log-structured engine,数据存储时,存储引擎将插入和更新的数据分组存储在内存中,并按照间隔顺序将数据以附加模式写入磁盘。一旦写入磁盘,则数据就不可变,也不会被覆盖。log-structured engine 可以避免覆盖并使用顺序I/O来更新数据,因此非常适合廉价的消费类SSD。
https://docs.datastax.com/en/ddac/doc/datastax_enterprise/dbArch/archPartitioners.html
2、cassandra数据的读写操作原理
https://docs.datastax.com/en/ddac/doc/datastax_enterprise/dbInternals/dbIntIntro.html
数据是如何写的?
- 1、Logging data in the commit log
- 2、Writing data to the memtable
- 3、Flushing data from the memtable
- 4、Storing data on disk in SSTables
读取请求流程?
如果压缩
配置虚拟节点
https://docs.datastax.com/en/dse/5.1/dse-admin/datastax_enterprise/config/configVnodeTOC.html
启用vnodes
在cassandra.yaml文件中:
1、取消注释num_tokens并设置所需的令牌数。
2、(推荐)要使用分配算法,请取消注释allocate_tokens_for_local_replication_factor ,并将其设置为数据中心中键空间的目标复制因子。如果复制发生变化,则在复制因子(RF)设置之间切换。
3、注释掉initial_token或保留未设置状态。
要将现有群集升级到vnode,请参阅在现有生产群集上启用虚拟节点。
禁用vnodes
在cassandra.yaml文件中:
1、注释掉num_tokens和 allocate_tokens_for_local_replication_factor。
2、取消注释initial_token并将其设置为1 或多节点集群的生成标记的值。
三、cassandra配置信息
1、jvm优化
调整java虚拟机jvm可以提高性能优化或减少高内存消耗。默认使用垃圾优先回收器(G1)。
java垃圾回收器的设置,在jvm.options文件中:
- 1、注释掉GI Settings行,表示开启GI
- 2、注释掉 CMS Settings行,表示开启CMS
对于使用G1的节点,DataStax建议尽可能大的MAX_HEAP_SIZE,最高64 GB。
参考:https://docs.datastax.com/en/ddac/doc/datastax_enterprise/operations/opsTuneJVM.html
2、cassandra.yaml
常用参数的配置:
- listen_address:默认值是localhost,数据库绑定ip或主机名,用于将此节点链接到其他节点。注意:禁止listen_address设置为0.0.0.0,不能同时设置listen_address或listen_interface。
- commitlog_directory:存储提交日志的目录。
- seed_provider:指定集群的seeds
- data_file_directories:存储表叔的目录位置。
- saved_caches_directory:存储表键和行高速缓存的目录位置
- incremental_backups:默认值false,备份上次拍摄快照以来更新的数据。
性能属性:
- commitlog_sync:默认值periodic,用于以毫秒为单位确认写入。
- commitlog_sync_period_in_ms:默认值10000,配合commitlog_sync的periodic。控制提交日志与磁盘同步的频率。
- commitlog_segment_size_in_mb:默认值:32,单位MB,表示单个commitlog文件大小。用于将所有数据刷新到SSTable后,可以对提交日志段进行存档、删除、回收。
- memtable_flush_writers:刷新写入程序的线程数,这些线程被磁盘I/O阻塞,每个线程在被阻塞时内存中保存一个memtable。SSD时增加此参数值,默认值2,最大值8。
- memtable_heap_space_in_mb:默认值堆大小的1/4,为memtbles分配堆内存量。
- memtable_offheap_space_in_mb:默认值堆大小的1/4,为memtbles分配堆外内存量。memtable_offheap_space_in_mb和memtable_heap_in_mb的值来自动memtable flush的阈值。
- trickle_fsync:默认值true。设置为true时,会导致操作系统以设置的间隔trickle_fsync_interval_in_kb刷新脏页缓冲区。启动该参数可防止突发脏页缓冲区刷新影响读取延迟。建议在ssd开启,HDD关闭。
使用端口
-
trickle_fsync_interval_in_kb:默认值:1024.以千字节为单位的大小fsync。
-
storage_port:默认值7000.节点间通信的端口。
-
native_transport_port:默认值:9042.cql传输监听客户端的端口。
-
rpc_port:默认值:9160.用于客户端的Thrift端口
-
ssl_storage_port:默认值:7001。用于加密通信的SSL端口。除非在encryption_options中启用,否则不使用。
-
native_transport_port_ssl:默认值:9142。如果启用了客户端加密并且禁用了native_transport_port_ssl,则native_transport_port(默认值:9042)将加密所有流量。要同时使用未加密和加密的流量,请启用native_transport_port_ssl。
-
auto_snapshot:默认值 true。设置为true时,当数据库库在截断keyspace或删除表之前获取数据快照。建议设置为true,防止数据丢失。
-
key_cache_save_period:默认值14400.(4小时)keys存在缓存中的时间(以秒为单位),缓存保存在saved_caches_directory。保存在缓存中减少了冷启动时的I/O影响,提高启动速度。
-
slow_query_log_timeout_in_ms:默认值:500,节点记录慢日志。选择超过此值的查询会生成聚合日志消息以识别慢速查询。禁用设置0.
-
internode_authenticator:默认值:AllowAllAuthorizer,禁用授权,cassandra不需要认证。值为CassandraAuthorizer,表示存储system_auth.permissions表中的权限,当system_auth系统keyspace复制因子为1,则无法访问集群,因此当设置CassandrAuthorizer时,修改system_auth的复制因子。多数据中心,确保复制设置为NetworkTopologyStrategy。
设置vnode:
- num_tokens:为虚拟节点令牌体系结构设置此属性。确定要分配给此虚拟节点(vnode)的令牌范围数。使用1到128之间的数字,其中 1禁用vnodes。当令牌号在数据中心中的节点之间变化时,vnode逻辑分配相对于数据中心中的其他节点的比例数量的范围。通常,如果所有节点具有相同的硬件能力,则每个节点应具有相同的 num_tokens值。
- allocate_tokens_for_local_replication_factor:将vnode添加到现有群集或在新数据中心中设置节点时,请设置为数据中心中键空间的目标复制因子(RF)。触发推荐 的RF和 算法分配num_tokens对于这个节点。分配算法尝试以优化指定RF的数据中心节点上的复制负载的方式选择令牌。分配给每个节点的负载接近于vnode的数量。
如果allocate_tokens_for_local_replication_factor 也被注释掉,则启用随机算法 。
- vnodes配置
启用vnodes
在cassandra.yaml文件中:
1、取消注释num_tokens并设置所需的令牌数。
2、(推荐)要使用分配算法,请取消注释allocate_tokens_for_local_replication_factor ,
并将其设置为数据中心中键空间的目标复制因子。如果复制发生变化,
则在复制因子(RF)设置之间切换。
3、注释掉initial_token或保留未设置状态。
禁用vnodes
在cassandra.yaml文件中:
1、注释掉num_tokens和 allocate_tokens_for_local_replication_factor。
2、取消注释initial_token并将其设置为1 或多节点集群的生成标记的值。
https://docs.datastax.com/en/ddac/doc/datastax_enterprise/config/configCassandra_yaml.html
四、cql常用操作
1、CREATE KEYSPACE
CREATE KEYSPACE eo_cs WITH replication = {'class': 'NetworkTopologyStrategy', 'datacenter1': '3'} AND durable_writes = true;
2、CREATE ROLE
语法:
CREATE ROLE [IF NOT EXISTS] role_name [WITH SUPERUSER = true | false | LOGIN = true | false | PASSWORD = ‘password’ | OPTIONS = option_map]
create ROLE eocs WITH SUPERUSER = false and password = ‘eocs’ and login=true;
3、grant
语法:
GRANT privilege ON resource_name TO role_name
GRANT all PERMISSIONS ON KEYSPACE eo_cs TO eocs;
GRANT select ON KEYSPACE eo_cs TO eocs;
privilege选项:all permissions、alter、authorize、create、describe、execute、modify、select
4、REVOKE
REVOKE AUTHORIZE on KEYSPACE eo_cs from eocs;
5、DROP ROLE
语法:
drop role [if exists] role_name;
6、alter keyspace
语法:
ALTER KEYSPACE keyspace_name
WITH REPLICATION = {‘class’ : ‘SimpleStrategy’, ‘replication_factor’ : N
| ‘class’ : ‘NetworkTopologyStrategy’, ‘dc1_name’ : N [, …]}
[AND DURABLE_WRITES = true|false] ;
CREATE KEYSPACE eo_im WITH replication = {'class': 'NetworkTopologyStrategy', 'datacenter1': '3'} AND durable_writes = true;
- DURABLE_WRITES:(可选)(不推荐),通过禁用持久写入(DURABLE_WRITES = false)来写入键空间时绕过提交日志。默认值是true。
小心:使用SimpleStrategy复制时,不要禁用持久写入。
7、alter role
语法: alter role role_name [with [password = ‘yourpassword’] [login = true|false] [superuser = true|false] [options = map_literal]]
- password:更改密码
- superuser:为其他启动或禁用超级用户状态,不能是当前登录的角色。将超级用户设置为false,撤销创建新角色的权限,但不会撤销已存在的authorize,alterhe drop权限。
- login:启动或禁用当前角色以外的登录权限
8、alter table
语法:
ALTER TABLE [keyspace_name.] table_name
[ALTER column_name TYPE cql_type]
[ADD (column_definition_list)]
[DROP column_list | COMPACT STORAGE ]
[RENAME column_name TO column_name]
[WITH table_properties];
9、alter type
语法:
ALTER TYPE field_name
[ALTER field_name TYPE new_cql_datatype
| ADD (field_name cql_datatype[,…])
| RENAME field_name TO new_field_name[AND …]]
10、list
list 选项:
[ALL | ALTER | AUTHORIZE | CREATE | DESCRIBE | DROP | EXECUTE | MODIFY | ROLES | SELECT | USERS]
cassandra@cqlsh> list select;
role | username | resource | permission
-----------+-----------+--------------------+------------
cassandra | cassandra | <keyspace eeotest> | SELECT
cassandra | cassandra | <keyspace eo_cs> | SELECT
cassandra | cassandra | <keyspace eo_im> | SELECT
eo_im | eo_im | <keyspace eo_im> | SELECT
eocs | eocs | <keyspace eo_cs> | SELECT
11、truncate
立即且不可逆地从指定表中删除所有数据,并从该表派生的任何物化视图中删除所有数据。
语法:
TRUNCATE [TABLE] [keyspace_name.table_name]
在truncate表时需要以下操作:
- 1、如有必要,可使用cqlsh 一致性命令设置的一致性水平ALL。
- 2、使用nodetool status或其他工具确保所有节点都已启动并接收连接。
- 3、使用TRUNCATE或TRUNCATE TABLE,后跟表名。
例如:
TRUNCATE eo_im.test;或者
TRUNCATE TABLE eo_im.test;
注意: TRUNCATE向所有节点发送JMX命令,告诉他们删除保存指定表中数据的SSTable。如果这些节点中的任何节点已关闭或未响应,则该命令将失败并输出如下消息:
truncate cycling.user_activity;
Unable to complete request: one or more nodes were unavailable.
五、nodetool常用操作
nodetool status
查看集群状态
nodetool
参数:
short | long | description |
---|---|---|
-h | –host | hostname or ip address |
-p | –port | 端口号 |
-pwf | –password-file | 密码文件路径 |
-pw | –password | 密码 |
-u | –username | 用户名 |
– | 将选项与可能被误认为选项参数区分开 |
示例:
root@bj-ali-std1-data_slave-03:/# nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 172.23.245.103 4.34 GiB 256 ? 49165d85-3681-4307-abd5-2b5a641a5702 rack1
UN 172.23.245.105 10.73 GiB 256 ? 899e0381-c3c7-4111-9439-7b8302be9fac rack1
UN 172.23.245.104 8.42 GiB 256 ? de72d74a-516a-4d9e-b46f-c27a2b6e6f81 rack1
说明:
status 节点运行状态:
U:up的缩写
D:down的缩写
state 集群状态:
N:normal(正常)的缩写
L:leaving(离开)的缩写
J:joining(加入)的缩写
M:moving(移动)的缩写
Owns:
每个数据中心节点拥有的数据百分比乘以复制因子。例如,节点可以拥有33%的环,但如果复制因子为3,则显示100%。
注意:如果群集使用具有不同复制策略或复制因子的键空间,请在运行nodetool status时指定键空间以获取有意义的本机信息。
nodetool snapshot
1、查看快照列表:
root@cassandra-2:~# nodetool listsnapshots
2、清除快照:
root@cassandra-2:~# nodetool clearsnapshot
Requested clearing snapshot(s) for [all keyspaces]
root@cassandra-2:~# nodetool listsnapshots
Snapshot Details:
There are no snapshots
3、创建快照:
语法:nodetool -h localhost -p 7199 snapshot
root@cassandra-2:~# nodetool snapshot xn_dolphin_1
Requested creating snapshot(s) for [xn_dolphin_1] with snapshot name [1539103181091] and options {skipFlush=false}
Snapshot directory: 1539103181091
root@cassandra-2:~# nodetool listsnapshots
Snapshot Details:
Snapshot name Keyspace name Column family name True size Size on disk
1539103181091 xn_dolphin_1 dolphin_conversation_message 0 bytes 1.18 KiB
1539103181091 xn_dolphin_1 dolphin_conversation_member 0 bytes 1.02 KiB
1539103181091 xn_dolphin_1 dolphin_conversation_list 0 bytes 946 bytes
1539103181091 xn_dolphin_1 zoogate_blacklist 0 bytes 1.01 KiB
1539103181091 xn_dolphin_1 dolphin_conversation 0 bytes 1.1 KiB
1539103181091 xn_dolphin_1 dolphin_wchat_openid 0 bytes 895 bytes
1539103181091 xn_dolphin_1 dolphin_leaving_msg 0 bytes 1.27 KiB
1539103181091 xn_dolphin_1 dolphin_conversation_visitorinfo 0 bytes 1.2 KiB
1539103181091 xn_dolphin_1 dolphin_member_inout 0 bytes 1.05 KiB
1539103181091 xn_dolphin_1 zoogate_login_info 0 bytes 1.02 KiB
1539103181091 xn_dolphin_1 dolphin_conversation_result 5.1 MiB 5.1 MiB
1539103181091 xn_dolphin_1 dolphin_conversation_statistics 0 bytes 1 KiB
Total TrueDiskSpaceUsed: 5.1 MiB
4、恢复数据
nodetool flush
从memtable中刷新一个或多个表。
语法:
nodetool < options > flush - < keyspace >(< table > …)
选项
短 | 长 | 描述 |
---|---|---|
-h | –host | 主机名或IP地址 |
-p | –port | 端口号。 |
-pwf | –password-file | 密码文件路径。 |
-pw | –password 密码。 | |
-u | –username | |
keyspace | 键空间的名称。 | |
table | 一个或多个表名,用空格分隔。 | |
– | 将选项与可能被误认为选项的参数分开。 |
描述:
指定一个键空间,后跟一个或多个要从memtable刷新到磁盘上的SSTables的表。
nodetool repair
修复数据的一致性
在增加副本因子时,使用repair把保证数据副本个数满足需求。
nodetool cleanup
在减少副本因子时,使用cleanup 来清除多余的副本数据。
nodetool gossipinfo
集群的gossip信息
nodetool removenode
删除某个节点
nodetool removenode HostID//删除一个节点 例:./nodetool removenode ec1411fc-4ac9-473d-8374-f2fc293e6472
nodetool removenode status //查看删除状态
nodetool removenode force //如果用status发现总在等待一个节点, 行一次force停掉
nodetool removenode host_id
nodetool netstats
获取有关主机的网络信息。
nodetool reloadseeds
重新加载种子节点列表。
nodetool drain
将节点所有memtables数据刷新到SSTables硬盘。此操作会中断来自其他节点的监听,需要重启该节点。如果只是要讲memtables刷新到磁盘上,建议使用nodetool flush。一般在Cassandra版本升级的时候才使用这个命令。
nodetool tablestats eo_cs.eo_name
查看表的一些信息,包括读的次数,写的次数,sstable的数量,memtable信息,压缩信息,bloomfilter信息。
和nodetool cfstats一样
nodetool compactionstats
统计正在压缩的任务
nodetool enablebackup
启动增量备份
对应nodetool disablebackup
nodetool gcstats
打印垃圾收集(GC)统计信息。
nodetool ring
Provides node status and information about the ring.
[root@tidb1 ~]# nodetool ring
Datacenter: datacenter1
==========
Address Rack Status State Load Owns Token
9217867712051363644
10.0.0.61 rack1 Up Normal 321.02 KiB ? -9218584694210041843
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9217256112395284002
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9210889157837833843
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9171000296116146048
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9152550881329104468
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9105469006225184150
10.0.0.63 rack1 Up Normal 310.56 KiB ? -9101761092802475775
10.0.0.61 rack1 Up Normal 321.02 KiB ? -9038091519118775922
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9030971017156121076
10.0.0.61 rack1 Up Normal 321.02 KiB ? -9026658576359436277
10.0.0.61 rack1 Up Normal 321.02 KiB ? -8988926568650120334
nodetool statushandoff
Provides the status of hinted handoff.
[root@tidb1 ~]# nodetool statushandoff
Hinted handoff is running